You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch实现的COVID CT影像诊断模型训练多轮损失不下降问题咨询

损失不下降的硬问题排查

1. 优化器学习率严重超标

当前代码用Adam搭配lr=0.1,这是Adam官方推荐默认学习率的100倍:

  • 这么大的步长会让参数每次更新都直接跨过最优解区间,在损失平面上来回震荡,根本没法收敛
  • 你观测到的损失长期卡在38上下小幅波动、完全不下降的表现,就是超高学习率的典型症状
    修正:把学习率降到1e-4 ~ 1e-3区间,再观察收敛情况。

2. 损失函数的张量形状完全不匹配

BCEWithLogitsLoss要求输入logits和目标标签形状完全一致,当前实现有两个硬性不匹配:

  • 卷积分支的输出经过reshape([-1,])后是一维张量,形状为[batch_size];但从数据加载器取出的标签通常是二维形状[batch_size, 1],PyTorch的隐式广播会导致损失计算完全偏离逐样本二分类的逻辑,算出来的损失值根本没有参考意义
  • 单logit输出的二分类场景下,标签需要是float类型,直接传入Long类型的整数类别标签,会引入隐式类型转换的计算偏差
    修正:
    • 取到标签后执行labels = labels.float().reshape_as(out),保证两个张量形状和数据类型完全对齐

3. 代码存在多处必现bug,只是当前没触发分支

这些问题现在用卷积分类分支没碰到,但只要切到FC分支百分百报错:

  • compose_classifier函数的FC分支写完层结构后没有return语句,调用时会返回None直接抛错
  • FC分支里写的线性层输入维度是14**2*256,但网络最后加了AdaptiveAvgPool2d((1,1)),不管前面特征图多大,最后都会被压成256*1*1的尺寸,这时候线性层输入维度和实际输出形状完全对不上
  • 256通道的卷积层后面漏了BatchNorm2d,前面32/64/128通道的卷积都配了BN,唯独这层没加,会造成特征分布持续偏移,训练稳定性极差
    修正:
    • FC分支的Sequential定义完成后补return classifier
    • 把FC分支的线性层输入维度改成256*1*1,和AdaptiveAvgPool的输出尺寸匹配
    • 在256通道的卷积层后补nn.BatchNorm2d(256)

4. 收敛的参考基准

随机初始化的二分类模型,用BCEWithLogitsLoss的初始损失应该接近ln2 ≈ 0.69,你现在的损失值远高于这个基准,进一步说明损失计算逻辑错了,不是模型本身学不动。

内容的提问来源于stack exchange,提问作者tyler1998UofU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 13:36:04