我在尝试使用 Resnet50 进行图像分类问题时遇到了错误,并且无法解决它。
RuntimeError: inconsistent tensor size, expected tensor [120 x 2048] and src [1000 x 2048] to have the same number of elements, but got 245760 and 2048000 elements respectively at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorCopy.c:86
错误发生在以下代码中。
self.resnet = models.resnet50(num_classes=num_breeds, pretrained='imagenet')
模型代码如下
class Resnet(nn.Module): def __init__(self): super(Resnet,self).__init__() self.resnet = models.resnet50(num_classes=num_breeds, pretrained='imagenet') #self.resnet = nn.Sequential(*list(resnet.children())[:-2]) #self.fc = nn.Linear(2048,num_breeds) def forward(self,x): x = self.resnet(x) return x
回答:
当你使用 num_classes=num_breeds
创建 models.resnet50
时,最后一层是一个从 2048
到 num_classes
的全连接层(在你的例子中是120)。
使用 pretrained='imagenet'
会让 PyTorch 加载所有对应的权重到你的网络中,但它的最后一层是针对1000个类别设计的,而不是120个。这就是错误的来源,因为 2048x120
的张量与加载的权重 2048x1000
不匹配。
你可以选择创建一个具有1000个类别的网络并加载权重,然后“剪裁”到你想要保留的类别。或者你可以创建一个你想要的具有120个类别的网络,但需要手动加载权重。在后一种情况下,你只需要特别注意最后一层即可。