YOLOv11小白的进击之路(七)训练输出日志解读以及训练OOM报错解决办法

YOLO 训练输出日志解读

我们在进行训练时,在控制台会输出如下图所示的 YOLO 训练输出日志:

我们逐一来分析,从左到右每列通常代表以下信息: 

  • Epoch:当前训练已进行的轮数和总轮数。例:83/150 即第 83 个 Epoch,共计要训练 150 个 Epoch。
  • GPU_mem:显示当前使用的显存大小(如 3.66G),方便监控显存占用情况。
  • box_loss / cls_loss / dfl_loss:这仨就是不同类型的损失项(我们可以调整三个损失项的权重,YOLO11默认box: 7.5,cls: 0.5,dfl: 1.5)这些数值越低通常代表模型在该部分的预测越准确。
  1. box_loss:边界框回归的损失,衡量预测框和真实框的差异。
  2. cls_loss:分类损失,用于判断目标种类是否预测正确。
  3. dfl_loss:如果使用了 DFL (Distribution Focal Loss) 分布焦点损失,在这里显示分布回归带来的损失。
  • Instances:表示该 batch (或该 Epoch 累计)中所包含的目标实例数量,比如 209 个目标框。

  • Size:显示训练使用的图像分辨率(如 512: 100%),以及进度条(“118/118” 表示当前 epoch 一共有 118 个 batch 已经完成)。
  • 旁边的时间 [00:10<00:00, 10] 等表示已用时、估计剩余时间、以及处理速度(约多少张图片/秒或 batch/秒)。
  • Class / Images / Instances / Box(P) / R / mAP50 / mAP50-95(表格下方汇总行):
  1. Class: “all” 表示对所有类别做总体统计。
  2. Images: 476 → 验证/测试集里有 476 张图像。
  3. Instances: 10762 → 这 476 张图像中共包含 10762 个目标实例。
  4. Box(P): 0.563 → 模型框预测的精确率 (Precision)
  5. R: 0.475 → 模型框预测的召回率 (Recall)
  6. mAP50: 0.486 → 平均准确率 (AP) 在 IoU=0.5 时对各类取平均后再对所有类取平均;
  7. mAP50-95: 0.258 → 在 IoU 从 0.5 到 0.95(步长 0.05)对 AP 做平均后再对所有类别做平均,衡量更严格的检测效果。

综合起来,这些指标用来评估模型的检测效果和训练状况:

  • loss 趋势:随着训练进行,应当整体下降。
  • 精度与召回 (P / R):查询预测是否准确,以及是否漏检。
  • mAP:衡量检测整体准确率和召回率的综合指标,越高越好。

OutOfMemoryError错误解决

OOM错误背景

今天我在训练YOLO模型时,刚开始的几轮都能正常运行,本来已经放下心来,但是到第10轮的时候突然报错,顿时汗流浃背,看到错误如下:

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 6.55 GiB. GPU 0 has a total capacty of 23.55 GiB of which 2.90 GiB is free. Including non-PyTorch memory, this process has 0 bytes memory in use. Of the allocated memory 16.77 GiB is allocated by PyTorch, and 3.24 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

直译过来就是,torch.cuda.OutOfMemoryError: CUDA 内存不足。尝试分配 6.55 GiB。GPU 0 的总容量为 23.55 GiB,其中 2.90 GiB 可用。包含非 PyTorch 内存后,该进程目前使用了 0 字节的内存。在已分配的内存中,有 16.77 GiB 被 PyTorch 分配,另外 3.24 GiB 被 PyTorch 保留但未实际使用。如果保留但未使用的内存较大,请尝试设置 max_split_size_mb 来避免碎片化。有关内存管理和 PYTORCH_CUDA_ALLOC_CONF 的更多信息,请参阅文档(感觉是很礼貌很有深意的高情商发言,需要琢磨琢磨...

翻译成大白话就是,这个报错表示在 GPU 上分配显存时出现了不足,应该是因为训练过程需要的显存超过了当前可用显存(PyTorch 会报告需要的显存量、已分配的显存和剩余显存等信息)。简单来说,就是咱们设置的训练配置(模型大小、Batch Size 等)太大了导致 GPU 显存不够用了

可能的原因

  1. 训练批大小过大:每个 batch 中的图像数量太多,导致一次前向/反向传播需要分配过多的显存。(我就是把batch设置为了-1,理想的情况应该是自动调整批次大小,到显卡能够容纳的最多图像数量,但是实际情况就是前几轮训练的很快,后面就开始报错...
  2. 模型结构或输入分辨率过大:如果模型非常大或者输入图像分辨率很高,对显存需求也会增加。
  3. 显存碎片化:显存中已有分配与释放导致碎片化,剩余空间(3.24 GiB)并不能一次性满足新请求(6.55 GiB)。PyTorch 提示可以调整 max_split_size_mb 来改善碎片化问题。
  4. 其他进程占用显存:你的系统上是否同时运行了其他占用 GPU 的进程,也会导致可用显存降低。

可能的解决方案

  1. 减小 Batch Size:这应该是最常见也最有效的做法了,用更小的 batch 大小来减少一次性分配的显存量。
  2. 降低图像分辨率:如果训练允许,可以把输入图像分辨率调低一些(但是或许对精度有点影响,对炼丹者不太友好)...
  3. 使用梯度累加(gradient accumulation):将大的 batch 划分成多个更小的 batch,累加梯度后再更新模型参数,减少单次前向/反向传播的显存需求。
  4. max_split_size_mb:根据报错提示,设置环境变量 PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:<value>(如 128 或 64)可能会缓解碎片化问题。
  5. 清理其他 GPU 进程:看看有没有其他程序占用了大量 GPU 资源,在启动训练前关了就OK,或者使用 nvidia-smi 来查看/释放 GPU。
  6. 混合精度训练:使用自动混合精度(AMP),在部分层用16位浮点数训练,可以显著减少显存占用(炼丹慎用)。

总的来看,当出现OOM报错时,可以先尝试把 Batch Size 调小或分辨率降一点,看看是否能正常运行。如仍出现 OOM 报错,可结合上述其他方法进一步优化...祝大家好运,炼丹顺利哈哈哈

最后

YOLOv11小白的进击之路系列持续更新中...欢迎一起交流探讨 ~ 砥砺奋进,共赴山海!

文章推荐:YOLOv11小白的进击之路(二)从YOLO类-DetectionModel类出发看YOLO代码运行逻辑..._if isinstance(m, detect,afpn4head): # includes all-优快云博客

YOLOv11小白的进击之路(六)创新YOLO的iou及损失函数时的源码分析-优快云博客

YOLOv11小白的进击之路(八)理解Grad-CAM可视化源码-优快云博客

### YOLOv11 输出层结构与配置解释 YOLOv11输出层设计相较于之前的版本有了显著改进,旨在提高检测精度和速度。以下是关于其输出层的具体结构和配置说明: #### 1. 多尺度特征融合 YOLOv11 使用多尺度特征金字塔网络 (FPN),通过不同层次的特征图进行上采样和下采样的操作来增强模型的感受野[^1]。 ```python class FPN(nn.Module): def __init__(self, in_channels_list, out_channels): super(FPN, self).__init__() # 定义卷积层和其他组件... ``` 这种架构允许模型更好地捕捉物体的不同尺寸信息,在多个尺度上提取更丰富的语义特征。 #### 2. 锚框机制优化 相比于早期版本采用固定的锚框设置,YOLOv11 动态调整锚框大小并引入自适应锚框生成算法,使得模型能够更加灵活地应对各种目标形状的变化。 #### 3. 预测头模块 预测头部由一系列卷积层组成,负责最终的目标分类、边界框回归以及对象置信度估计。对于每个位置上的每一个预设比例下的候选区域都会给出相应的预测结果。 ```python def forward(self, x): ... pred = torch.cat([cls_pred, reg_pred], dim=1) return pred.view(batch_size, num_anchors * grid_h * grid_w, output_dim) ``` 其中 `output_dim` 表示每种类型的预测数量(类别数加四个坐标参数),而 `num_anchors` 则对应于该网格单元所关联的所有可能的先验框数目。 #### 4. 损失函数定义 为了训练这个复杂的神经网络框架,损失函数被精心设计成包含三个部分:分类交叉熵损失、定位平滑L1损失 和 对象得分二元交叉熵损失。这些组成部分共同作用以指导整个系统的收敛过程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值