pytorch 运行时间错误:mat1和mat2形状不能相乘(229376x7和1024x512)

zbdgwd5y  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(150)

我正在使用预训练的DenseNet121模型构建CNN pn Pytorch。我正在用我的分类器替换预训练模型的分类器。我试着用两种方法来做。虽然第一个工作,第二个给了上述错误,而训练。我需要使用第二个来添加对模型的关注。为什么第二个是错误的,当两者都是相同的?
第一个正常工作的代码

model = models.densenet121(pretrained=True)
for param in model.parameters():
    param.requires_grad = False
classifier = nn.Sequential(OrderedDict([
                          ('fc1', nn.Linear(1024, 512)),
                          ('relu', nn.ReLU()),
                          ('fc2', nn.Linear(512, 10)),
                          ('output', nn.LogSoftmax(dim=1))
                          ]))
model.classifier = classifier

字符串
第二个代码在训练时出错

net = models.densenet121(pretrained=True)
for param in net.parameters():
    param.requires_grad = False

class AttnDenseNet121(nn.Module):
    def __init__(self, num_classes, normalize_attn=False, dropout=None):
        super(AttnDenseNet121, self).__init__()
        self.features = net.features
        self.classifier = nn.Sequential(OrderedDict([
                          ('fc1', nn.Linear(1024, 512)),
                          ('relu', nn.ReLU()),
                          ('fc2', nn.Linear(512, 10)),
                          ('output', nn.LogSoftmax(dim=1))
                          ]))
    def forward(self, x):
        x = self.features(x)
        out = self.classifier(x)
        return out
model = AttnDenseNet121(num_classes=10, normalize_attn=True)


两者的培训代码相同,批次大小= 32

wz8daaqr

wz8daaqr1#

在研究了torchvision的源代码之后,我在这里找到了densenet的forward通道的实现。您可以看到在features模块和分类器之间应用了一些额外的层:

def forward(self, x: Tensor) -> Tensor:
    features = self.features(x)
    out = F.relu(features, inplace=True)
    out = F.adaptive_avg_pool2d(out, (1, 1))
    out = torch.flatten(out, 1)
    out = self.classifier(out)
    return out

字符串
您应该采用相同的管道以保持一致性。请注意,adaptive_avg_pool2d函数通过应用avg_pooling修改形状,以便每个特征图的形状为(1024,1,1)。然后,应用平坦化层以使形状(1024)的Map与分类器中的线性层兼容。无论输入图像大小如何,这两个函数都可以解决您的问题。

相关问题