pytorch中的model.eval()和BN层的使用


Posted in Python onMay 22, 2021

看代码吧~

class ConvNet(nn.module):
    def __init__(self, num_class=10):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
                                    nn.BatchNorm2d(16),
                                    nn.ReLU(),
                                    nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
                                    nn.BatchNorm2d(32),
                                    nn.ReLU(),
                                    nn.MaxPool2d(kernel_size=2, stride=2))
        self.fc = nn.Linear(7*7*32, num_classes)
         
    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        print(out.size())
        out = out.reshape(out.size(0), -1)
        out = self.fc(out)
        return out
# Test the model
model.eval()  # eval mode (batchnorm uses moving mean/variance instead of mini-batch mean/variance)
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

如果网络模型model中含有BN层,则在预测时应当将模式切换为评估模式,即model.eval()。

评估模拟下BN层的均值和方差应该是整个训练集的均值和方差,即 moving mean/variance。

训练模式下BN层的均值和方差为mini-batch的均值和方差,因此应当特别注意。

补充:Pytorch 模型训练模式和eval模型下差别巨大(Pytorch train and eval)附解决方案

当pytorch模型写明是eval()时有时表现的结果相对于train(True)差别非常巨大,这种差别经过逐层查看,主要来源于使用了BN,在eval下,使用的BN是一个固定的running rate,而在train下这个running rate会根据输入发生改变。

解决方案是冻住bn

def freeze_bn(m):
    if isinstance(m, nn.BatchNorm2d):
        m.eval()
model.apply(freeze_bn)

这样可以获得稳定输出的结果。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
linux下python使用sendmail发送邮件
May 22 Python
Django rest framework工具包简单用法示例
Jul 20 Python
python使用matplotlib绘制热图
Nov 07 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Python自动化测试笔试面试题精选
Mar 12 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
基于python的matplotlib制作双Y轴图
Apr 20 Python
详解Python生成器和基于生成器的协程
Jun 03 Python
解决Pytorch中关于model.eval的问题
Pytorch 中net.train 和 net.eval的使用说明
May 22 #Python
对PyTorch中inplace字段的全面理解
May 22 #Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 #Python
用python实现监控视频人数统计
Python基础之进程详解
如何在C++中调用Python
May 21 #Python
You might like
php session安全问题分析
2011/06/24 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
javascript模拟订火车票和退票示例
2014/04/24 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
require.js的用法详解
2015/10/20 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python发送告警邮件脚本
2018/09/17 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
幼儿园中班教学反思
2014/02/10 职场文书
自我鉴定总结
2014/03/24 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
党员自评材料范文
2014/12/17 职场文书
英语投诉信范文
2015/07/03 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL