【发布时间】: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)如果过度拟合(更有可能)- 增加学习率,如果拟合不足 - 减少学习
-
被引统计在所有数据集中持续存在;训练集和验证集相同
标签: tensorflow keras classification conv-neural-network batch-normalization