torch.no_grad()和nn.Module.eval()区别

torch.no_grad():       

         在no-grad模式下,计算的行为就像没有一个输入需要grad一样。换句话说,即使有require_grad=True的输入,无grad模式下的计算也不会被记录在后向图中。

        当你需要执行不应该被autograd记录的操作,但你仍然希望以后在grad模式下使用这些计算的输出时,启用no-grad模式。这个上下文管理器可以方便地禁用一个代码块或函数的梯度,而不需要临时将张量设置为 requires_grad=False,然后再恢复为 True。

例如,在编写优化器时,无梯度模式可能很有用:在执行训练更新时,你想就地更新参数,而不被autograd记录。你还打算在下一次前进过程中使用更新的参数进行梯度模式的计算。

torch.nn.init中的实现在初始化参数时也依赖无梯度模式,以避免在原地更新初始化参数时被autograd记录。

nn.Module.eval():

        评估模式实际上不是一种局部禁用梯度计算的机制。但我们还是把它包括在这里,因为它有时会被混淆成这样一种机制。

        从功能上讲,module.eval()(或者等同于module.train(False))与无梯度模式和推理模式是完全正交的。model.eval()如何影响你的模型,完全取决于你的模型中使用的具体模块,以及它们是否定义了任何训练模式下的特定行为。

        如果你的模型依赖于诸如 torch.nn.Dropout 和 torch.nn.BatchNorm2d 等模块,这些模块可能会根据训练模式的不同而表现出不同的行为,例如,为了避免在验证数据上更新你的 BatchNorm 运行统计数据,你有责任调用 model.eval() 和 model.train() 。

        建议你在训练时总是使用model.train(),在评估你的模型(验证/测试)时总是使用model.eval(),即使你不确定你的模型有训练模式的特定行为,因为你正在使用的模块可能被更新为在训练和评估模式下的不同行为。

总结:

no_grad():在其作用范围内,require_grad不起作用(即require_grad=False),不会被autograd记录,跳出作用范围之外,require_grad恢复其进入no_grad()前一时刻状态

module.eval():torch.nn.Dropout 和 torch.nn.BatchNorm2d 等模块只能在训练时起作用,而在验证和测试时不起作用,调用module.eval()方法则torch.nn.Dropout 和 torch.nn.BatchNorm2d 等模块不起作用

在验证和测试时,no_grad()和module.eval()要一起使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值