I would like to do transfer learning, ie. pretrain on CIFAR100 and train on Imagewoof. What am I doing wrong?
import fastai.vision as vision
from fastai.vision import *
data = ImageDataBunch.from_folder(untar_data(URLs.CIFAR_100, dest='/data'), valid="test")
learn = vision.cnn_learner(data, models.resnet18, metrics=[accuracy], pretrained=False)
learn.fit_one_cycle(10, slice(0.0005, 0.0005 * 30))
data2 = ImageDataBunch.from_folder(untar_data(URLs.IMAGEWOOF, dest='/data'), valid="val")
learn2 = vision.cnn_learner(data2, learn.model, metrics=[accuracy])
learn2.fit_one_cycle(5, slice(0.0014, 0.0014 * 30))
Gives me the error: TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not bool
muellerzr
(Zachary Mueller)
July 13, 2020, 4:18pm
2
You cannot pass an architecture explicitly into cnn_learner
. If you want to do what you have described, you should instead use a Learner
. IE:
learn2 = Learner(data2, learn.model, metrics=[accuracy], loss_func=CrossEntropyLossFlat(), splitter=default_split).freeze()
(I’m not 100% exactly sure on the splitter there, you’d want to look at cnn_learner
's source code to verify if that does not work.
1 Like
Jacopo
(Mangiavacchi)
August 20, 2020, 10:36pm
3
Hi @muellerzr ,
I tried to reference the previously trained cnn_learner using the Learner and specifying learn.model as you suggest
learn2 = Learner(dls2, learn.model, metrics=accuracy)
Unfortunately as soon as I use the new learner to fine tune I got this runtime error:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-30-37b3634da61a> in <module>()
1 learn4 = Learner(dls2, learn.model, metrics=accuracy)
----> 2 learn4.fine_tune(20)
19 frames
/usr/local/lib/python3.6/dist-packages/fastai2/torch_core.py in _f(self, *args, **kwargs)
296 def _f(self, *args, **kwargs):
297 cls = self.__class__
--> 298 res = getattr(super(TensorBase, self), fn)(*args, **kwargs)
299 return retain_type(res, self, copy_meta=True)
300 return _f
RuntimeError: CUDA error: device-side assert triggered
Do you have any advise ? Thanks!!
Jacopo
(Mangiavacchi)
August 24, 2020, 10:34pm
4
I figure it out it was my mistake. Reading the book I got the wrong misunderstanding that the Learner automatically adapt the last layer based on the passed dataloaders labels.
I’ve manually changed the last linear layer of the model before passing it to the Learner and everything works now.