我想从经过微调的AlexNet的4096层中提取fc7维特征向量。我的目标是稍后使用此层进行群集。
这是我提取它的方式:

alexnet = models.alexnet(pretrained=True);
fc7 = alexnet.classifier[6];


但是,当我打印它时,fc7是一个Linear对象:

Linear(in_features=4096, out_features=1000, bias=True)


我正在寻找的是如何将此Linear对象转换为numpy数组,以便可以对其进行进一步的操作。
我在想的是调用其方法'def forward(self, input)',但不确定要提供哪个输入?我应该提供输入图像还是应该提供输出fc6层?

而且我想要4096 -dim输入数组并摆脱1000输出数组(大概是因为我认为这不会对群集有所帮助)。

最佳答案

这可以通过创建一个新模型来完成,除了最后一层以外,该模型具有与alexnet相同的所有层(和相关参数)。

new_model = models.alexnet(pretrained=True)
new_classifier = nn.Sequential(*list(new_model.classifier.children())[:-1])
new_model.classifier = new_classifier


现在,您应该能够将输入图像提供给new_model并提取4096维特征向量。

如果出于某种原因确实需要特定的图层作为numpy数组,则可以执行以下操作:fc7.weight.data.numpy()

(在PyTorch 0.4.0上)

08-24 15:49