【问题标题】: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)数据集中提供(下图)

有什么办法吗?


已尝试故障排除
  1. 禁用退出
  2. 禁用所有正则化器(batch-norm 除外)
  3. 随机地,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_normalizationdropout 是罪魁祸首。主要变化:
  • 删除了 LSTM、GaussianNoise、SqueezeExcite 块(如下图)
  • 已实现 batch_norm patch
  • 添加了 sample_weights 以反映类不平衡 - 介于 0.75 和 2 之间。
  • 接受过针对 MaxPool 和 Input dropouts 的各种预热方案的训练

观察到了相当大的改进 - 但不是几乎全部。训练与验证损失行为真的很奇怪 - 翻转类预测,并轰炸它刚刚训练过的完全相同的数据集

此外,BatchNormalization 在训练期间与测试期间的输出差异很大(如下图)


更新 2: 排除了所有其他怀疑:BatchNormalization 是罪魁祸首。使用带有 SELU 和 AlphaDropout 的自归一化网络 (SNN) 代替 BatchNormalization 会产生稳定且一致的结果。

【问题讨论】:

  • 我会推荐 1) 绘制训练精度和训练损失。如果准确率过早达到 100% 或训练损失下降得太快,则增加正则化 2)如果过度拟合(更有可能)- 增加学习率,如果拟合不足 - 减少学习
  • 被引统计在所有数据集中持续存在;训练集和验证集相同

标签: tensorflow keras classification conv-neural-network batch-normalization


【解决方案1】:

我无意中留下了一个非标准化样本(一批 32 个),其中包含 sigma=52 - 这严重破坏了 BN 层;标准化后,我不再观察到训练和推理模式之间的强烈差异——如果有的话,任何差异都很难发现。

此外,整个预处理非常错误 - 正确重做后,问题不再重现。作为调试提示,请尝试确定任何特定的训练数据集是否会在推理过程中急剧改变层激活。

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多