我正在使用预训练的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
1条答案
按热度按时间wz8daaqr1#
在研究了torchvision的源代码之后,我在这里找到了densenet的
forward
通道的实现。您可以看到在features
模块和分类器之间应用了一些额外的层:字符串
您应该采用相同的管道以保持一致性。请注意,
adaptive_avg_pool2d
函数通过应用avg_pooling修改形状,以便每个特征图的形状为(1024,1,1)。然后,应用平坦化层以使形状(1024)的Map与分类器中的线性层兼容。无论输入图像大小如何,这两个函数都可以解决您的问题。