我想从经过微调的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上)