Pytorch:将VGG模型转换为顺序模型,但得到不同的输出



背景:我正在研究一种对抗性检测器方法,该方法需要访问每个隐藏层的输出。我从torchvision.models加载了一个预训练的VGG16。

为了访问每个隐藏层的输出,我将其放入一个顺序模型中:

vgg16 = models.vgg16(pretrained=True)
vgg16_seq = nn.Sequential(*(
list(list(vgg16.children())[0]) + 
[nn.AdaptiveAvgPool2d((7, 7)), nn.Flatten()] + 
list(list(vgg16.children())[2])))

如果没有nn.Flatten(),正向方法将抱怨mat1mat2之间的尺寸不匹配。

我研究了torchvisionVGG实现,它使用[feature..., AvgPool, flatten, classifier...]结构。由于AdaptiveAvgPool2d层和Flatten没有参数,我认为这应该有效,但我有不同的输出。

output1 = vgg16(X_small)
print(output1.size())
output2 = vgg16_seq(X_small)
print(output2.size())
torch.equal(output1, output2)

问题:它们处于同一维度,但输出不同。

火炬。尺寸([321000](
焊炬。大小([321000](
错误

我在AdaptiveAvgPool2d层之后测试了输出,输出相等:

output1 = nn.Sequential(*list(vgg16.children())[:2])(X_small)
print(output1.size())
output2 = nn.Sequential(*list(vgg16_seq)[:32])(X_small)
print(output2.size())
torch.equal(output1, output2)

火炬。尺寸([32552,7,7](
焊炬。大小([32552,7,7](
True

有人能指出哪里出了问题吗?谢谢

在进行推理之前,需要调用eval模式。

vgg16.eval()
vgg16_seq.eval()

相关内容

  • 没有找到相关文章