讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么PyTorch分类模型的测试准确率在训练中长时间保持不变?

梦芳大大_6566

梦芳大大_6566

发布时间:2026-01-28 09:25:00

|

932人浏览过

|

来源于php中文网

原创

为什么pytorch分类模型的测试准确率在训练中长时间保持不变? - php中文网

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个以上,显示值就不会改变。

例如:

PyTorch Linux版 2.11.0
PyTorch Linux版 2.11.0

PyTorch 2.11.0 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、实验复现和指定环境安装。

下载
  • 当前正确数 = ( 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)

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

2303

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

68

2025.12.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn