pytorch修改预训练模型的结构,增加网络,获取中间层特征数据

这里写自定义目录标题

想借助几个预训练模型,提取出中间层的特征。比如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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值