pytorch bn 如何冻结 以及train 和val下区别

如何冻结

一般要冻结特征提取层(pretrain layer)的bn 还有一些自己定义的bn不应该冻结 因此在自己的model里重写train

#示例程序 在自己写的model里添加 
    def train(self, mode=True):
        """
        Override the default train() to freeze the BN parameters
        """
        super(fintuneNet, self).train(mode)
        if self.args.freeze_bn and mode==True:
            print('modify train in ')
            self.branch_cnn.apply(self.fix_bn)
#branch_cnn特征提取层 一般是一个 nn.Sequential()
        return self
    def fix_bn(self,m):
        classname = m.__class__.__name__
        # print('classname',classname)
        if classname.find('BatchNorm') != -1:
            m.eval()
            m.track_running_stats=False
            for i, (name1, p) in enumerate(m.named_parameters()):
                p.requires_grad = False

train val 区别

最主要区别有两个

1、train状态下参数更新、使用是当前batch的统计量。runing means 不使用 但是forworad时候就更新了 

2、val状态下参数不更新 、使用的是train的时候记录的runing means

3、track_running_stats 标识是train状态下是否更新 running means

推荐好文:Pytorch BN(BatchNormal)计算过程与源码分析和train与eval的区别_一只皮皮虾x的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值