深入理解model.eval()与torch.no_grad()

model.eval()
  • 使用model.eval()切换到测试模式,不会更新模型的k(权重),b(偏置)参数
  • 通知dropout层和batchnorm层在train和val中间进行切换:
    • train模式,dropout层会按照设定的参数p设置保留激活单元的概率(保留概率=p,比如keep_prob=0.8),batchnorm层会继续计算数据的mean和var并进行更新
    • val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值
  • model.eval()不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反向传播(backprobagation)
torch.no_grad()
  • 用于停止autograd模块的工作,起到加速和节省显存的作用(具体行为就是停止gradient计算,从而节省了GPU算力和显存)
  • 不会影响dropout和batchnorm层的行为

**model.eval()torch.no_grad()**可以同时用,更加节省cpu的算力

思考

  • 在val模式下,为什么让dropout层所有的激活单元都通过,因为train阶段的dropout层已经屏蔽掉了一些激活单元,在val模式下,让所有的激活单元都通过还能预测数据吗?
    • 在val模式下,让所有的激活单元都通过当然能预测数据了,相当于学习时限定你每次只能选择一份资料学,考试时开卷所有资料你都带着。val模式下,虽然让所有的激活单元都通过,但是对于各个神经元的输出, 要乘上训练时的删除比例后再输出。
posted @   小Aer  阅读(397)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示