model.train()与model.val()

文章讨论了在MMPose框架中,使用torch.save()保存的模型与重新加载后的模型在推理时产生不同结果的问题。关键在于model.eval()的使用。不加model.eval()在推理时会影响BatchNormalization和Dropout层的行为,导致与原始模型的输出不一致。当转换为ONNX模型后,推理结果变得一致,暗示了最初的问题可能出在模型的训练状态管理上。
部署运行你感兴趣的模型镜像

一、问题描述

  1. 需要将mmpose框架下训练的模型单独保存出来,做后续处理。
  2. 用torch.save()直接保存模型mmpose_model.pt,然后重新搭建模型,把保存的模型参数加载进去,得到scratch_model.pt
  3. 使用scratch_model.pt进行推理,与mmpose_model.pt推理结果不同。二者都转成onnx模型后,推理结果与mmpose_model.pt的推理结果相同。

二、问题分析

mmpose_model.pt与scratch_model.pt的数据预处理以及输出的后处理是一致的,所以应该是模型加载的时候有问题。
查资料发现,使用scratch_model.pt进行推理的时候,没有加model.eval()

二、model.train()与model.val()区别

  1. 参考https://blog.youkuaiyun.com/libaominshouzhang/article/details/119741474
  2. 参考https://blog.youkuaiyun.com/qq_38410428/article/details/101102075
    model.train()与model.val()在处理BatchNormalizationDropout层时候的机制不同。
    model.train()时,BatchNormalization的参数会根据输入更新,Dropout使输入以p的概率参与计算
    model.eval()时,BatchNormalization的参数则会固定,与保存的值一致,Dropout不起作用,所有输入参与计算
    在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值