标题:为什么PyTorch分类模型的测试准确率在训练中长时间保持不变?
技术百科
心靈之曲
发布时间:2026-01-28
浏览: 次 pytorch训练过程中测试准确率长时间不变,本质是离散精度限制所致:当测试集样本量固定(如113个),准确率最小可变单位为1/n ≈ 0.0088,微小预测变化无法反映在四舍五入后的显示值中。
在深度学习实践中,观察到测试准确率在多个连续epoch中“停滞不变”(如您日志中从Epoch 4到Epoch 15稳定在0.8584,后续又在0.8673、0.8761等平台期停留数十轮),常被误认为模型收敛异常或训练失效。但实际这很可能是准确率的固有离散性(discrete resolution) 导致的正常现象,而非代码缺陷或模型问题。
? 根本原因:准确率是离散指标,非连续变量
准确率定义为:
[
\text{Accuracy} = \frac{\text{正确预测样本数}}{\text{测试集总样本数}} = \frac{k}{N}, \quad k \in {0,1,\dots,N}
]
因此其理论最小变化步长为 ( \frac{1}{N} )。
从您的混淆矩阵可验证测试集规模:
[[46 1 15] → 第0类共62 [16 7 4] → 第1类共27 [ 2 2 20]] → 第2类共24 Total = 62 + 27 + 24 = 113
故 ( \frac{1}{113} \approx 0.00885 )。而您打印的准确率保留4位小数(如 0.8584),恰好与该分辨率一致——只要正确预测数未增减1个以上,显示值就不会改变。
例如:
- 当前正确数 = ( 0.8584 \times 113 \approx 97 )(实际97/113 ≈ 0.8584)
- 下一可能值 = 98/113 ≈ 0.8673(正是您日志中出现的下一个平台)
- 再下一值 = 99/113 ≈ 0.8761
这完全匹配您的输出序列:0.8584 → 0.8673 → 0.8761 → 0.8850 → ... —— 每次跃迁都对应整数级正确样本数的提升。
✅ 验证方法(推荐加入调试)
在 test() 函数中添加一行,输出原始正确数与总数:
correct = sum(torch.tensor(all_preds) == torch.tensor(all_targets))
print(f"Epoch {epoch}: Test Correct/Total = {correct}/{len(all_targets)} ({correct/len(all_targets):.4f})")您将看到 correct 值在多数epoch中确实保持整数恒定(如97→98→99),直观印证离散性。
⚠️ 注意事项与最佳实践
- 勿仅依赖准确率判断收敛:尤其在类别不平衡或小测试集时,准确率敏感度低。建议同步监控测试损失(连续值)、F1-score、或每个类别的精确率/召回率。
- 避免过早终止训练:平台期≠收敛。损失仍在下降(如您日志中 test_loss 从 0.9916 降至 0.4208),说明模型仍在优化决策边界,只是尚未突破下一个准确率台阶。
- 打印精度可调:若需观察细微变化,改用更高精度(如 :.6f)或直接输出 correct/total 分数形式。
- 线性网络限制:您明确要求仅用线性层(无激活函数),这本身会限制模型表达能力。若任务复杂度高,即使准确率“卡住”,也可能反映模型容量瓶颈——此时应检查数据是否线性可分,或考虑增加隐藏层维度(如 nn.Linear(50, 100))而非更换激活函数。
? 总结
测试准确率长时间不变,大概率不是bug,而是小规模测试集下准确率固有的离散特性所致。理解 1/N 分辨率原理,能帮助您更理性解读训练曲线、避免误判模型性能,并将关注点转向更鲁棒的评估指标(如损失值、置信度校准、混淆矩阵动态变化)。真正的收敛应由验证损失平稳+准确率达到预期平台+无过拟合迹象共同判定,而非单一数值的“跳变”。
# ✅ 推荐的调试增强版 test() 片段(替换原函数)
def test(dataloader, model, loss_fn):
model.eval()
all_preds, all_targets = [], []
test_loss = 0.0
with torch.no_grad():
for X, y in dataloader:
pred = model(X)
test_loss += loss_fn(pred, y.long()).item()
all_preds.extend(pred.argmax(1).cpu().numpy())
all_targets.extend(y.cpu().numpy())
test_loss /= len(dataloader)
correct = sum(np.array(all_preds)
== np.array(all_targets))
total = len(all_targets)
accuracy = correct / total
confusion_mat = confusion_matrix(all_targets, all_preds)
return test_loss, accuracy, confusion_mat, (correct, total)
# 深度学习
# 您的
# 更高
# 多个
# 长时间
# 很可能
# 而非
# 并将
# app
# 下一
# 为什么
# red
# bug
# 可调
# pytorch
# 如您
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11关机快捷键是什么_Win11快速关机方法
- Win11怎么开启游戏模式_Win11优化游戏帧数
- 如何使用Golang写入二进制文件_Golang
- Win11资源管理器卡顿怎么办 Win11文件资源
- c++的位运算怎么用 与、或、异或、移位操作详解【
- 如何关闭Win10自动更新更新_Win10系统自动
- Python集合操作技巧_高效去重解析【教程】
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- Python异步编程高级项目教程_asyncio协
- 如何在 VS Code 中正确配置并使用 NumP
- php接口返回数据乱码怎么办_php接口调试编码问
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- 如何使用Golang实现容器自动化运维_Golan
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Windows 11怎么设置默认解压软件_Wind
- 如何使用Golang实现微服务状态监控_Golan
- Win11怎么开启HDR模式_Windows 11
- php订单日志怎么按金额排序_php按订单金额排序
- Windows11怎么用“记事本”自动换行与编码
- Mac如何将HEIC图片格式转为JPG_Mac批量
- Win11怎么设置默认浏览器Chrome_Wind
- Windows11怎样开启游戏模式_Windows
- 如何使用Golang进行HTTP服务性能测试_测量
- php能跑在stm32上吗_php在stm32微控
- php订单日志怎么记录物流_php记录订单物流变更
- 如何在同包不同文件中正确引用 Go 结构体
- c++ atoi和atof函数用法_c++字符数组
- Win11如何设置开机自动联网 Win11宽带连接
- mac本地php环境如何开启curl_curl扩展
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11怎么清理C盘OneDrive缓存_Win
- Windows10怎么查看系统激活状态_Windo
- Win10怎么查看内存时序参数_Win10CPU-
- Windows服务持续崩溃怎样修复_系统服务保护机
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- 手机php怎么转mp4_手机端php文件转mp4a
- Win11怎么设置指纹解锁 Win11笔记本录入指
- 本地php环境出现502错误_nginx或apac
- 如何使用Golang log设置日志输出格式_Go
- 如何在 Django 中修改用户密码后保持会话不丢
- Win11怎么开启窗口对齐助手_Windows11
- Win11右键反应慢怎么办 Win11优化右键菜单
- 如何在 Windows 11 中使用 AlomWa
- 如何在Golang中实现邮件发送功能_Golang
- Win11怎么设置右键刷新选项_Windows11
- Win11怎么设置开机问候语_自定义Win11锁屏
- c++怎么使用std::unique实现去重_c+


QQ客服