Hi,
I just recently started the course and navigated to datablock tutorials from a lecture video. I wanted to finetune a learner to predict these bounding boxes on COCO_TINY data. I am getting an error when I try to fine tune. What am I doing wrong here? I was wondering if I am jumping too much here as maybe the topic will be covered in upcoming lectures?
The code from example tutorial:
from fastai.data.all import *
from fastai.vision.all import *
coco_source = untar_data(URLs.COCO_TINY)
images, lbl_bbox = get_annotations(coco_source/'train.json')
img2bbox = dict(zip(images, lbl_bbox))
coco = DataBlock(blocks=(ImageBlock, BBoxBlock, BBoxLblBlock),
get_items=get_image_files,
splitter=RandomSplitter(),
get_y=[lambda o: img2bbox[o.name][0], lambda o: img2bbox[o.name][1]],
item_tfms=Resize(128),
batch_tfms=aug_transforms(),
n_inp=1)
cc = coco.dataloaders(coco_source, bs=32)
learn = vision_learner(cc, resnet18, metrics=error_rate)
learn.fine_tune(3)
The error when I run this code:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/tmp/ipykernel_47/1149343912.py in <cell line: 0>()
1 learn = vision_learner(cc, resnet18, metrics=error_rate)
----> 2 learn.fine_tune(3)
/usr/local/lib/python3.11/dist-packages/fastai/callback/schedule.py in fine_tune(self, epochs, base_lr, freeze_epochs, lr_mult, pct_start, div, **kwargs)
165 "Fine tune with `Learner.freeze` for `freeze_epochs`, then with `Learner.unfreeze` for `epochs`, using discriminative LR."
166 self.freeze()
--> 167 self.fit_one_cycle(freeze_epochs, slice(base_lr), pct_start=0.99, **kwargs)
168 base_lr /= 2
169 self.unfreeze()
/usr/local/lib/python3.11/dist-packages/fastai/callback/schedule.py in fit_one_cycle(self, n_epoch, lr_max, div, div_final, pct_start, wd, moms, cbs, reset_opt, start_epoch)
119 scheds = {'lr': combined_cos(pct_start, lr_max/div, lr_max, lr_max/div_final),
120 'mom': combined_cos(pct_start, *(self.moms if moms is None else moms))}
--> 121 self.fit(n_epoch, cbs=ParamScheduler(scheds)+L(cbs), reset_opt=reset_opt, wd=wd, start_epoch=start_epoch)
122
123 # %% ../../nbs/14_callback.schedule.ipynb 50
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in fit(self, n_epoch, lr, wd, cbs, reset_opt, start_epoch)
270 self.opt.set_hypers(lr=self.lr if lr is None else lr)
271 self.n_epoch = n_epoch
--> 272 self._with_events(self._do_fit, 'fit', CancelFitException, self._end_cleanup)
273
274 def _end_cleanup(self): self.dl,self.xb,self.yb,self.pred,self.loss = None,(None,),(None,),None,None
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _with_events(self, f, event_type, ex, final)
205
206 def _with_events(self, f, event_type, ex, final=noop):
--> 207 try: self(f'before_{event_type}'); f()
208 except ex: self(f'after_cancel_{event_type}')
209 self(f'after_{event_type}'); final()
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _do_fit(self)
259 for epoch in range(self.n_epoch):
260 self.epoch=epoch
--> 261 self._with_events(self._do_epoch, 'epoch', CancelEpochException)
262
263 def fit(self, n_epoch, lr=None, wd=None, cbs=None, reset_opt=False, start_epoch=0):
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _with_events(self, f, event_type, ex, final)
205
206 def _with_events(self, f, event_type, ex, final=noop):
--> 207 try: self(f'before_{event_type}'); f()
208 except ex: self(f'after_cancel_{event_type}')
209 self(f'after_{event_type}'); final()
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _do_epoch(self)
253
254 def _do_epoch(self):
--> 255 self._do_epoch_train()
256 self._do_epoch_validate()
257
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _do_epoch_train(self)
245 def _do_epoch_train(self):
246 self.dl = self.dls.train
--> 247 self._with_events(self.all_batches, 'train', CancelTrainException)
248
249 def _do_epoch_validate(self, ds_idx=1, dl=None):
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _with_events(self, f, event_type, ex, final)
205
206 def _with_events(self, f, event_type, ex, final=noop):
--> 207 try: self(f'before_{event_type}'); f()
208 except ex: self(f'after_cancel_{event_type}')
209 self(f'after_{event_type}'); final()
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in all_batches(self)
211 def all_batches(self):
212 self.n_iter = len(self.dl)
--> 213 for o in enumerate(self.dl): self.one_batch(*o)
214
215 def _backward(self): self.loss_grad.backward()
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in one_batch(self, i, b)
241 b = self._set_device(b)
242 self._split(b)
--> 243 self._with_events(self._do_one_batch, 'batch', CancelBatchException)
244
245 def _do_epoch_train(self):
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _with_events(self, f, event_type, ex, final)
205
206 def _with_events(self, f, event_type, ex, final=noop):
--> 207 try: self(f'before_{event_type}'); f()
208 except ex: self(f'after_cancel_{event_type}')
209 self(f'after_{event_type}'); final()
/usr/local/lib/python3.11/dist-packages/fastai/learner.py in _do_one_batch(self)
225 self('after_pred')
226 if len(self.yb):
--> 227 self.loss_grad = self.loss_func(self.pred, *self.yb)
228 self.loss = self.loss_grad.clone()
229 self('after_loss')
TypeError: BaseLoss.__call__() takes 3 positional arguments but 4 were given