前言:
{
最近在调试一个包括efficientnet[1]的网络,其中efficientnet部分被用来做特征提取。我在尝试把efficientnet换成torchvision[2]中的其他网络。但是在第一次尝试resnet101时就发现了这个问题。
}
正文:
{
在阅读torchvision中的resnet部分的源码[3]后,我发现这里貌似不提供提取特征的方法,运行计算的方法只有forward()(代码1),但是forward输出的是最后的类别向量,而我需要的是特征图。
#代码1,resnet
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.fc(x)
return x
我想了一下,修改torchvision的原代码不是很容易,我决定在我的代码里对ResNet类或其实例进行修改。添加提取特征的成员函数或修改forward()都不是很方便,因为就像代码1展示的那样,每种网络都有特定的结构,这样做的话我需要为所有我使用的torchvision模型做单独修改。
<