Load saved Unet Model giving 'AttributeError: c'

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