这里写自定义目录标题
想借助几个预训练模型,提取出中间层的特征。比如resnet50,最后两层是这样
我的目的是提取多个预训练模型最后层的特征,并且想要保证同一维度,所以希望添加一个模块,例如将resnet50的fc改造成这样,每个预训练模型的最后层都能从in_features改变成256维度。
但问题来了,pytorch 提取中间层特征,只能提取到model的根节点,例如global_pool或者fc层,想要拿到fc中的第0层没有办法。
于是想把fc改成两层,第一层为Liner(2048,256),第二层为剩余的relu,dropout,linear(256,2).
于是使用了add_module,先把原来fc删了,然后用add_module添加刚才这两层。
结果发现loss居然变成负的了,检查发现,输出的维度居然不一样。才反应过来,这只是改了网络结构定义,在forward里面没有真正执行。
后来找到这个https://www.jb51.net/article/167928.htm
想改的话必须要把整个网络重写一遍才行。复制粘贴下,共未来参考。
resnet_layer = nn.Sequential(*list(model.children())[:-2])
class Net(nn.Module):
def init(self , model):
super(Net, self).init()
#取掉model的后两层
self.resnet_layer = nn.Sequential(*list(model.children())[:-2])
self.transion_layer = nn.ConvTranspose2d(2048, 2048, kernel_size=14, stride=3)
self.pool_layer = nn.MaxPool2d(32)
self.Linear_layer = nn.Linear(2048, 8)
def forward(self, x):
x = self.resnet_layer(x)
x = self.transion_layer(x)
x = self.pool_layer(x)
x = x.view(x.size(0), -1)
x = self.Linear_layer(x)
return x