I am using unet_learner
to run segmentation on my dataset. I want to use the best model, that is saved during the training process, however when it finishes the learner variable keeps the model from the last epoch.
So, I tried to run inference using the saved pth model.
data = (SegmentationItemList.from_folder(patches_folder)
.split_none()
.label_empty()
.transform(size=256)
.databunch(bs=4,num_workers=1)
.normalize(imagenet_stats))
and then learn = unet_learner(data, models.resnet50, metrics=metrics)
But this does not work, resulting in the following error:
AttributeError Traceback (most recent call last)
<ipython-input-29-ee569adab9f3> in <module>
----> 1 learn = unet_learner(data, models.resnet50, metrics=metrics)
/usr/local/lib/python3.6/dist-packages/fastai/vision/learner.py in unet_learner(data, arch, pretrained, blur_final, norm_type, split_on, blur, self_attention, y_range, last_cross, bottle, cut, **learn_kwargs)
114 meta = cnn_config(arch)
115 body = create_body(arch, pretrained, cut)
--> 116 model = to_device(models.unet.DynamicUnet(body, n_classes=data.c, blur=blur, blur_final=blur_final,
117 self_attention=self_attention, y_range=y_range, norm_type=norm_type, last_cross=last_cross,
118 bottle=bottle), data.device)
/usr/local/lib/python3.6/dist-packages/fastai/basic_data.py in __getattr__(self, k)
120 return cls(*dls, path=path, device=device, dl_tfms=dl_tfms, collate_fn=collate_fn, no_check=no_check)
121
--> 122 def __getattr__(self,k:int)->Any: return getattr(self.train_dl, k)
123 def __setstate__(self,data:Any): self.__dict__.update(data)
124
/usr/local/lib/python3.6/dist-packages/fastai/basic_data.py in __getattr__(self, k)
36
37 def __len__(self)->int: return len(self.dl)
---> 38 def __getattr__(self,k:str)->Any: return getattr(self.dl, k)
39 def __setstate__(self,data:Any): self.__dict__.update(data)
40
/usr/local/lib/python3.6/dist-packages/fastai/basic_data.py in DataLoader___getattr__(dl, k)
18 torch.utils.data.DataLoader.__init__ = intercept_args
19
---> 20 def DataLoader___getattr__(dl, k:str)->Any: return getattr(dl.dataset, k)
21 DataLoader.__getattr__ = DataLoader___getattr__
22
/usr/local/lib/python3.6/dist-packages/fastai/data_block.py in __getattr__(self, k)
637 res = getattr(y, k, None)
638 if res is not None: return res
--> 639 raise AttributeError(k)
640
641 def __setstate__(self,data:Any): self.__dict__.update(data)
AttributeError: c
I can manage to use a saved model for inference, doing this after the training is finished:
learn.freeze()
learn.export()
learn.purge()
But again, that’s not what I want, since this saves the last model and not the best one, right?
Code used to train:
learn.fit_one_cycle(200, max_lr=lr,
callbacks=[
SaveModelCallback(learn,
monitor='valid_loss',
mode='min',
name='20190116-rn101unet-comboloss-alldata-1000-epochs')
]
)
I appreciate any suggestion,
Kind regards