关于pytorch的BN,在训练的模型上增添新模块[只训练新模块]

关于Pytorch的BN

目前在做一些人脸方面的内容,场景是在一个训练完成的模型上加一些功能(要是模型也能支持装饰器就好了😄)。

假定现在已经有了一个训练好的模型 A \mathbf{A} A(包含了BN和Dropout层),现在在 A \mathbf{A} A的基础上额外添加了一些层 L L L,需要对这些新添加的层进行训练。

那么"常规"的做法就如下:

model = build_new_model() # add requires_grad=False to those untrained parameters
model.load_state_dict(torch.load('model_A.pth'), strict=False)
optimizer = torch.optim.Adam(filter(lambda x: x.requires_grad, model.parameters()), lr=lr)
# add some codes about learning rate schedule ... 
# train part
model.train()
# some training code balabala ... 
model.eval()
# some validating/testing code balabla ...

但是这么出来的结果却不对,原因就是在于BN和Dropout层上,详细的分析可以参考这个blog

原因在于无论你怎么设置requires_grad跟BN都没有关系,BN的moving average的参数只跟model.train()或者model.eval()有关…

纠正方法也不难,手动把BN类全部手动拉成eval模式就行。

def fix_bn(m):
    classname = m.__class__.__name__
    if classname.find('BatchNorm') != -1:
        m.eval()

model.train()
model.apply(fix_bn)
# some training code balabala ... 
model.eval()
model.apply(fix_bn)
# some validating/testing code balabla ...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值