验证损失 >> 训练损失,相同数据,二元分类器
Posted
技术标签:
【中文标题】验证损失 >> 训练损失,相同数据,二元分类器【英文标题】:Validation loss >> train loss, same data, binary classifier 【发布时间】:2019-10-08 12:49:55 【问题描述】:我实现了this paper's 神经网络,有一些差异(如下图),用于脑电图分类; train_on_batch
性能非常好,损失非常低 - 但test_on_batch
性能虽然在相同的数据上很差:网络似乎总是预测'1',大多数时候: p>
TRAIN (loss,acc) VAL (loss,acc)
'0' -- (0.06269842,1) (3.7652588,0)
'1' -- (0.04473557,1) (0.3251827,1)
数据以 30 秒的片段(12000 个时间步长)(每个数据集 10 分钟)的形式一次从 32 个(=batch_size)数据集中提供(下图)
有什么办法吗?
已尝试故障排除:
-
禁用退出
禁用所有正则化器(batch-norm 除外)
随机地,val_acc('0','1') = (~.90, ~.12) - 然后返回 (0,1)
更多详情:
Keras 2.2.4(TensorFlow 后端)、Python 3.6、Spyder 3.3.4(通过 Anaconda) CuDNN LSTM 有状态 预训练 CNN,之后添加 LSTM(并且都经过训练)BatchNormalization
在每个 CNN 和 LSTM 层之后
reset_states()
应用于不同数据集之间
squeeze_excite_block 在除最后一个 CNN 块之后插入
更新: 取得了进展;
batch_normalization
和 dropout
是罪魁祸首。主要变化:
删除了 LSTM、GaussianNoise、SqueezeExcite 块(如下图)
已实现 batch_norm patch
添加了 sample_weights
以反映类不平衡 - 介于 0.75 和 2 之间。
接受过针对 MaxPool 和 Input dropouts 的各种预热方案的训练
观察到了相当大的改进 - 但不是几乎全部。训练与验证损失行为真的很奇怪 - 翻转类预测,并轰炸它刚刚训练过的完全相同的数据集:
此外,BatchNormalization
在训练期间与测试期间的输出差异很大(如下图)
更新 2: 排除了所有其他怀疑:BatchNormalization 是罪魁祸首。使用带有 SELU 和 AlphaDropout 的自归一化网络 (SNN) 代替 BatchNormalization 会产生稳定且一致的结果。
【问题讨论】:
我会推荐 1) 绘制训练精度和训练损失。如果准确率过早达到 100% 或训练损失下降得太快,则增加正则化 2)如果过度拟合(更有可能)- 增加学习率,如果拟合不足 - 减少学习 被引统计在所有数据集中持续存在;训练集和验证集相同 【参考方案1】:我无意中留下了一个非标准化样本(一批 32 个),其中包含 sigma=52
- 这严重破坏了 BN
层;标准化后,我不再观察到训练和推理模式之间的强烈差异——如果有的话,任何差异都很难发现。
此外,整个预处理非常错误 - 正确重做后,问题不再重现。作为调试提示,请尝试确定任何特定的训练数据集是否会在推理过程中急剧改变层激活。
【讨论】:
以上是关于验证损失 >> 训练损失,相同数据,二元分类器的主要内容,如果未能解决你的问题,请参考以下文章
TensorBoard - 在同一张图上绘制训练和验证损失?
tf.keras model.fit():在相同数据上火车损失和val损失之间的巨大差异
如何解释模型学习曲线(训练和验证数据的时代准确率和损失曲线)?