【学习】pytorch中with torch.no_grad():和 model.eval()的区别

这篇具有很好参考价值的文章主要介绍了【学习】pytorch中with torch.no_grad():和 model.eval()的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

model.eval()和with torch.no_grad()的区别
先给出结论: 这两个的所起的作用是不同的。

model.eval()

model.eval()的作用是不启用Batch Normalization 和 Dropout. 相当于告诉网络,目前在eval模式,dropout层不会起作用(而在训练阶段,dropout会随机以一定的概率丢弃掉网络中间层的神经元,而且在实际操作过程中一般不在卷积层设置该操作,而是在全连接层设置,因为全连接层的参数量一般远大于卷积层),batch normalization也有不同的作用(在训练过程中会对每一个特征维做归一化操作,对每一批量输入算出mean和std,而在eval模式下BN层将能够使用全部训练数据的均值和方差,即测试过程中不再针对测试样本计算mean和std,而是用训练好的值)。

with torch.no_grad()

当我们计算梯度的时候,我们需要缓存前向传播过程中大量的中间输出,因为在反向传播pytoch自动计算梯度时需要用到这些值。而我们在测试时,我们不需要计算梯度,那么也就意味着我们不需要在forward的时候保存这些中间输出。此外,在测试阶段,我们也不需要构造计算图(这也需要一定的存储开销)。Pytorch为我们提供了一个上下文管理器,torch.no_grad,在with torch.no_grad() 管理的环境中进行计算,不会生成计算图,不会存储为计算梯度而缓存的中间值。

结论

当网络中出现batch normalization或者dropout这样的在training,eval时表现不同的层,应当使用model.eval()。在测试时用with torch.no_grad()会节省存储空间。

另外需要注意的是,即便不使用with torch.no_grad(),在测试只要你不调用loss.backward()就不会计算梯度,with torch.no_grad()的作用只是节省存储空间。当然,在测试阶段,可以两者一起使用,效果更好。
总的来说,区别不大。文章来源地址https://www.toymoban.com/news/detail-837107.html

到了这里,关于【学习】pytorch中with torch.no_grad():和 model.eval()的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解PyTorch中的train()、eval()和no_grad()

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) 在PyTorch中,train()、eval()和no_grad()是三个非常重

    2023年04月08日
    浏览(47)
  • 【Python】torch.no_grad()函数详解和示例

    torch.no_grad() 是 PyTorch 中的一个上下文管理器,用于在进入该上下文时禁用梯度计算。这在你只关心评估模型,而不是训练模型时非常有用,因为它可以显著减少内存使用并加速计算。 当你在 torch.no_grad() 上下文管理器中执行张量操作时,PyTorch 不会为这些操作计算梯度。这意

    2024年03月12日
    浏览(52)
  • python:torch.no_grad()的作用 + requires_grad,grad_fn,grad的含义及使用

    requires_grad: grad_fn: grad: 说法1: 说法2: 代码: 保证param原地数值改变操作下requires_grad=True不变。 参考资料: requires_grad,grad_fn,grad的含义及使用 测试torch.no_grad()的作用 pytorch中torch.no_grad有什么用? PyTorch 中的“with torch no_grad”有什么作用?

    2024年02月17日
    浏览(44)
  • 【Pytorch】梯度裁剪——torch.nn.utils.clip_grad_norm_的原理及计算过程

    众所周知,梯度裁剪是为了防止梯度爆炸。在训练FCOS算法时,因为训练过程出现了损失为NaN的情况,在github issue有很多都是这种训练过程出现loss为NaN,作者也提出要调整梯度裁剪的超参数,于是理了理梯度裁剪函数 torch.nn.utils.clip_grad_norm_ 的计算过程,方便调参。 torch.nn.u

    2024年02月12日
    浏览(60)
  • 【pytorch】同一个模型model.train()和model.eval()模式下的输出完全不同

    测试时为什么要使用model.eval() - 小筱痕 - 博客园 (cnblogs.com) 输出不同的原因是由于student模型中的某些层的行为不同。一些层,如dropout和batch normalization,在训练和评估过程中的行为是不同的。 在训练过程中,dropout层会随机将一部分输入置为零,这有助于防止过拟合。dropou

    2024年02月12日
    浏览(56)
  • pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

    time.time() time.perf_counter() time.process_time() time.time() 和time.perf_counter() 包括sleep()time 可以用作一般的时间测量,time.perf_counter()精度更高一些 time.process_time()当前进程的系统和用户CPU时间总和的值 测试代码: 测试结果: 更详细解释参考 Python3.7中time模块的time()、perf_counter()和proce

    2024年02月06日
    浏览(45)
  • ModuleNotFoundError: No module named ‘models‘解决torch.load问题【天坑】

    当使用torch.load时,报错No module named ‘models’ 在网上查了很多资料说目录结构得和保存时一模一样,话虽如此,但一直没理解要如何一样 最后调试发现,No module named \\\'models’报错说没有models,确实是因为没有. 比如下面: 我训练的用torch.save(model, checkpoint_path)保存的模型文件,那

    2024年02月14日
    浏览(55)
  • 【PyTorch】torch.cat() 和 torch.concat() 的区别

    两者没区别 根据 PyTorch 官方文档:https://pytorch.org/docs/stable/generated/torch.concat.html torch.concat() 是 torch.cat() 的别称,无区别

    2024年02月12日
    浏览(37)
  • Pytorch种torch.cat与torch.stack的区别

    torch.cat 和 torch.stack 是 PyTorch 中用于拼接张量的两个不同的函数,它们的主要区别在于拼接的方式和创建的维度。 torch.cat: 拼接方式: torch.cat 是按照给定的维度( dim 参数)将多个张量沿着该维度拼接。在拼接的维度上,张量的尺寸必须一致,除了拼接的维度之外。 创建的

    2024年01月16日
    浏览(36)
  • 已安装Pytorch,却提示no moudle named ‘torch’(没有名称为torch的模块)

    Pytorch 安装过很多遍(自己的老电脑,实验室的电脑,实验室换的新电脑,服务器的……)不同的显卡不同的服务器……遇到过很多坑都解决过,本以为 Pytorch 配置环境的坑已经被我踩完了。今天又遇到了这种情况:Pycharm 提示是没有名称为 torch 的模块,当然不能运行也不能

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包