I have the same problem as How can I load and use a PyTorch (.pth.tar) model which does not have an accepted answer or one I can figure out how to follow the advice given.
I'm new to PyTorch. I am trying to load the pretrained PyTorch model referenced here: https://github.com/macaodha/inat_comp_2018
I'm pretty sure I am missing some glue.
# load the model
import torch
model=torch.load("iNat_2018_InceptionV3.pth.tar",map_location='cpu')
# try to get it to classify an image
imsize = 256
loader = transforms.Compose([transforms.Scale(imsize), transforms.ToTensor()])
def image_loader(image_name):
"""load image, returns cuda tensor"""
image = Image.open(image_name)
image = loader(image).float()
image = Variable(image, requires_grad=True)
image = image.unsqueeze(0)
return image.cpu() #assumes that you're using CPU
image = image_loader("test-image.jpg")
Produces the error:
in () ----> 1 model.predict(image)
AttributeError: 'dict' object has no attribute 'predict
Problem
Your
model
isn't actually a model. When it is saved, it contains not only the parameters, but also other information about the model as a form somewhat similar to a dict.Therefore,
torch.load("iNat_2018_InceptionV3.pth.tar")
simply returnsdict
, which of course does not have an attribute calledpredict
.Solution
What you need to do first in this case, and in general cases, is to instantiate your desired model class, as per the official guide "Load models".
However, directly inputing the
model['state_dict']
will raise some errors regarding mismatching shapes ofInception3
's parameters.It is important to know what was changed to the
Inception3
after its instantiation. Luckily, you can find that in the original author'strain_inat.py
.Now that we know what to change, lets make some modification to our first try.
And there you go with successfully loaded model!