如何加载和使用预先绑定的PyTorch InceptionV3模型对图像进行分类



我遇到了与如何加载和使用PyTorch(.pth.tar(模型相同的问题,该模型没有一个可接受的答案,或者我可以弄清楚如何遵循给出的建议。

我是PyTorch的新手。我正在尝试加载此处引用的预训练PyTorch模型:https://github.com/macaodha/inat_comp_2018

我很确定我少了一些胶水。

# 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")

产生错误:

((中的

---->1模型预测(图像(

AttributeError:"dict"对象没有"predict "属性

问题

您的model实际上并不是一个模型。保存时,它不仅包含参数,还包含关于模型的其他信息,形式与dict有些相似

因此,torch.load("iNat_2018_InceptionV3.pth.tar")只是简单地返回dict,当然它没有名为predict的属性。

model=torch.load("iNat_2018_InceptionV3.pth.tar",map_location='cpu')
type(model)
# dict

解决方案

在这种情况下,以及在一般情况下,首先需要做的是根据官方指南"加载模型"实例化所需的模型类。

# First try
from torchvision.models import Inception3
v3 = Inception3()
v3.load_state_dict(model['state_dict']) # model that was imported in your code.

然而,直接输入model['state_dict']会引起一些关于Inception3的参数形状不匹配的错误。

重要的是要知道Inception3在实例化后更改了什么。幸运的是,你可以在原作者的train_inat.py中找到这一点。

# What the author has done
model = inception_v3(pretrained=True)
model.fc = nn.Linear(2048, args.num_classes) #where args.num_classes = 8142
model.aux_logits = False

现在我们知道要更改什么了,让我们对进行一些修改,首先尝试

# Second try
from torchvision.models import Inception3
v3 = Inception3()
v3.fc = nn.Linear(2048, 8142)
v3.aux_logits = False
v3.load_state_dict(model['state_dict']) # model that was imported in your code.

成功加载的模型就在这里!

最新更新