Python-model.train和model.eval区别

本文介绍了在PyTorch中,为何在训练和测试时需要使用model.train()和model.eval()来切换BatchNormalization和Dropout的模式。BatchNormalization在训练时使用每批数据的均值和方差,而在测试时使用全局统计信息;Dropout在训练时随机关闭部分神经元,测试时则保持所有神经元活跃。理解这些差异对于避免过拟合和优化模型性能至关重要。
摘要由CSDN通过智能技术生成

目录

 

1、简介

2、区别

结论

分析

Batch Normalization

Dropout

3、参考


1、简介

平时都是根据代码框架写代码,最近感觉是不是不用加model.train和model.eval是不是也行啥的,发现完全不是的,于是开始学习

2、区别

结论

  • 主要是针对model 在训练时和评价时不同的 Batch Normalization  和  Dropout 方法模式。
    • 启用 Batch Normalization 和 Dropout

    • 不启用 Batch Normalization 和 Dropout

  • 如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train(),在测试时添加model.eval()。
    • 其中model.train()是保证BN层用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差(pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值);
    • 而对于Dropout,model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接。

联系Batch Normalization和Dropout的原理之后就不难理解为何要这么做了。

分析

Batch Normalization

BN主要时对网络中间的每层进行归一化处理,并且使用变换重构(Batch Normalizing Transform)保证每层所提取的特征分布不会被破坏,详细参加Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。该算法主要如下:

训练时是正对每个min-batch的,但是在测试中往往是针对单张图片,即不存在min-batch的概念。由于网络训练完毕后参数都是固定的,因此每个批次的均值和方差都是不变的,因此直接结算所有batch的均值和方差。所有Batch Normalization的训练和测试时的操作不同

img1

Dropout

Dropout能够克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象,详细见文章:Dropout: A Simple Way to Prevent Neural Networks from Overtting具体如下所示:

 

img2

在训练中,每个隐层的神经元先乘概率P,然后在进行激活,在测试中,所有的神经元先进行激活,然后每个隐层神经元的输出乘P。

3、参考

Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别

model.train()和model.eval()的结果是不是一定是不同的?

预测时一定要记得model.eval()!

PyTorch(七)——模型的训练和测试、保存和加载

Pytorch中的model.train()与model.eval()原理和实验分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静静喜欢大白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值