You need to enable JavaScript to run this app. CNN训练时损失动态变化但训练、验证准确率始终恒定的原因排查
优惠活动
大模型
产品
解决方案
定价
更多

CNN训练时损失动态变化但训练、验证准确率始终恒定的原因排查

1D CNN三类信号分类异常排查

实际观测到的异常表现

  • 训练全程损失值随训练步长持续变化,但训练集、验证集的准确率始终卡在固定数值没有波动
  • 测试集评估结果完全偏向占比最高的normal类,apb、pvc两类的精确率、召回率全为0,模型没有学到这两类的任何判别特征
  • 数据集规模:拆分后训练集共1322个长度为10800的单通道信号,测试集共567个样本,其中normal类421个、apb类45个、pvc类101个,类别分布严重失衡
  • 训练过程:使用EarlyStopping回调,累计训练到4173个epoch才触发停止,过程中你替换过GlobalAveragePooling1D为Flatten层,异常现象没有任何改善

异常核心诱因

1. 模型坍缩到多数类预测逻辑

当前数据集里normal类占总样本量的74%,这种极不平衡的分布下,模型只要把所有样本都预测为normal类,就能拿到74%的固定准确率——这正好匹配你看到的“准确率全程不动”的现象。
你观测到的损失值持续变化也完全符合这个逻辑:softmax输出的概率值可以持续微调,categorical_crossentropy损失会随着概率值的微小变化持续下降,但只要所有样本的最大概率维度一直是normal类,argmax判断后的准确率就不会有任何变化,完全不存在“损失降了但准确率不动”的矛盾。

2. 网络结构对长时序信号的特征提取失效

你的单样本信号长度是10800,两层带2倍步长池化的卷积层跑完后,时序维度还剩2700,此时直接接GlobalAveragePooling1D,全局平均操作会把整个时序轴上的所有特征直接做均值计算。apb、pvc的判别特征本身就是时序上某一段的局部波形偏移,全局平均会直接把这些局部偏移和正常波形的特征中和抵消,最后送进全连接层的特征几乎没有任何类别区分度。
哪怕你换成Flatten层,2700*128维的高维特征搭配0.6的高Dropout率,每次训练有60%的特征会被随机屏蔽,占比极低的apb、pvc类本来样本量就少,根本扛不住这么强的正则化干扰,学不到任何有效判别规则。

3. 训练流程配置的系统性缺陷

  • 没有独立划分验证集:你只拆分了训练集和测试集,训练时用的是默认的训练集内部分割验证集,在模型已经坍缩到全预测normal类的状态下,验证集的准确率也会和训练集一样固定在74%左右,EarlyStopping根本检测不到模型没有学习的状态,所以才会跑四千多个epoch才停止。
  • 没有针对类别不平衡做补偿:既没有对少数类做过采样,也没有在损失计算时给少数类更高的权重,模型自然会优先拟合占比最高的normal类。
  • Dropout率设置过高:0.6的屏蔽比例对于仅1322个样本的小数据集来说正则化强度过强,进一步抑制了少数类特征的学习。

对应修复方案

  • 调整特征提取结构:在两层基础卷积池化层后,再加1-2层Conv1D+MaxPooling1D,把时序维度压缩到几百的尺度后再接Flatten层,不要直接用GlobalAveragePooling1D抵消局部时序的判别特征。
  • 调低Dropout率到0.2-0.3,匹配小样本场景的正则化强度,避免过度随机屏蔽特征。
  • 加入类别权重补偿:调用model.fit时通过class_weight参数,按类别的样本占比反向分配损失权重,让模型对apb、pvc类的预测错误施加更高的反向传播惩罚,打破“全预测normal类”的坍缩状态。
  • 独立划分验证集:从现有训练集里切出20%作为独立验证集,把EarlyStopping的监控指标换成验证集准确率,设置连续20个epoch无提升就停止训练,避免无意义的长时间空转。
  • 补全信号预处理的归一化流程:确认所有输入信号都做了幅值标准化,避免不同样本的幅值差异过大导致BatchNormalization的统计量偏移,进一步拉低特征提取的有效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 23:57:02