model.train()与model.val()

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

  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不起作用,所有输入参与计算
    在这里插入图片描述
### 关于YOLOv11模型验证代码示例 对于YOLOv11的模型验证,通常涉及几个核心组件:加载预训练模型、准备验证数据集以及执行评估流程。下面提供一段Python代码作为YOLOv11模型验证的例子: ```python from ultralytics import YOLO import torch from pathlib import Path def load_model(model_path): """ 加载指定路径下的YOLOv11模型. 参数: model_path (str): 模型权重文件路径 返回: model: 已加载到GPU上的YOLOv11模型实例 """ device = 'cuda' if torch.cuda.is_available() else 'cpu' model = YOLO(model_path).to(device) return model def validate_model(model, val_data_dir): """ 使用给定的数据目录对模型进行验证. 参数: model: 需要验证的YOLOv11模型对象 val_data_dir (str or Path): 包含验证图像及其标签的根目录路径 输出: 打印验证指标结果至控制台 """ results = model.val(data=val_data_dir) # 显示主要度量标准 print(f"Validation metrics:\n{results}") if __name__ == "__main__": # 设置模型和验证数据的位置 MODEL_PATH = r"runs/detect/voc_train/weights/best.pt" VAL_DATA_DIR = Path('path/to/validation/data') # 加载并验证模型 yolo_v11_model = load_model(MODEL_PATH) validate_model(yolo_v11_model, VAL_DATA_DIR) ``` 上述脚本展示了如何通过`ultralytics.YOLO`库加载一个预先训练好的YOLOv11模型,并利用该框架内置的功能来进行模型验证[^1]。 为了确保模型能够有效地泛化到未见数据上,应当保留一部分独立样本作为验证集,这有助于检测过拟合现象并调整超参数设置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值