验证损失 >> 训练损失,相同数据,二元分类器
Validation loss >> train loss, same data, binary classifier
我实现了 this paper's 神经网络,但有一些差异(下图),用于 EEG class化; train_on_batch
性能非常好,损失非常低 - 但 test_on_batch
性能虽然在 相同数据 上很差:网络似乎总是预测“1”,大多数时间:
TRAIN (loss,acc) VAL (loss,acc)
'0' -- (0.06269842,1) (3.7652588,0)
'1' -- (0.04473557,1) (0.3251827,1)
一次从 32 (= batch_size) 个数据集(img 下面)
有什么补救措施吗?
已尝试进行故障排除:
- 禁用辍学
- 禁用所有正则化器(batch-norm 除外)
- 随机,val_acc('0','1') = (~.90, ~.12) - 然后回到 (0,1)
其他详细信息:
- Keras 2.2.4(TensorFlow 后端),Python 3.6,通过 Anaconda 的 Spyder 3.3.4
- CuDNN LSTM 有状态
- CNNs 预训练,然后添加 LSTMs(并且都训练有素)
BatchNormalization
在每个 CNN 和 LSTM 层之后
reset_states()
应用于不同的数据集
- squeeze_excite_block 在除最后一个 CNN 块之后插入
更新:
取得了进展; batch_normalization
和 dropout
是罪魁祸首。主要变化:
- 删除了 LSTM、GaussianNoise、SqueezeExcite 块(下图)
- 已实施 batch_norm patch
- 添加
sample_weights
以反映 class 不平衡 - 在 0.75 和 2 之间变化。
- 针对 MaxPool 和 Input dropouts 使用各种预热方案进行训练
观察到相当大的改进 - 但不是全部。训练与验证损失行为确实很奇怪 - 翻转 class 预测,并轰炸与 刚刚训练 完全相同的数据集:
此外,BatchNormalization
训练与测试时间的输出差异很大(下图)
更新 2: 排除了所有其他怀疑:BatchNormalization 是罪魁祸首。使用带有 SELU 和 AlphaDropout 的自标准化网络 (SNN) 代替 BatchNormalization 会产生稳定且一致的结果。
我不小心遗漏了一个 non-standardized 样本(一批 32 个),sigma=52
- 这严重破坏了 BN
层; post-standardizing,我不再观察到训练模式和推理模式之间的明显差异 - 如果有的话,任何差异都很难发现。
另外,整个预处理过程非常错误,重新正确处理后,问题不再出现。作为调试提示,尝试确定任何特定训练数据集是否在推理过程中急剧改变层激活。
我实现了 this paper's 神经网络,但有一些差异(下图),用于 EEG class化; train_on_batch
性能非常好,损失非常低 - 但 test_on_batch
性能虽然在 相同数据 上很差:网络似乎总是预测“1”,大多数时间:
TRAIN (loss,acc) VAL (loss,acc)
'0' -- (0.06269842,1) (3.7652588,0)
'1' -- (0.04473557,1) (0.3251827,1)
一次从 32 (= batch_size) 个数据集(img 下面)
有什么补救措施吗?
已尝试进行故障排除:
- 禁用辍学
- 禁用所有正则化器(batch-norm 除外)
- 随机,val_acc('0','1') = (~.90, ~.12) - 然后回到 (0,1)
其他详细信息:
- Keras 2.2.4(TensorFlow 后端),Python 3.6,通过 Anaconda 的 Spyder 3.3.4
- CuDNN LSTM 有状态
- CNNs 预训练,然后添加 LSTMs(并且都训练有素)
BatchNormalization
在每个 CNN 和 LSTM 层之后reset_states()
应用于不同的数据集- squeeze_excite_block 在除最后一个 CNN 块之后插入
更新: 取得了进展;
batch_normalization
和 dropout
是罪魁祸首。主要变化:
- 删除了 LSTM、GaussianNoise、SqueezeExcite 块(下图)
- 已实施 batch_norm patch
- 添加
sample_weights
以反映 class 不平衡 - 在 0.75 和 2 之间变化。 - 针对 MaxPool 和 Input dropouts 使用各种预热方案进行训练
观察到相当大的改进 - 但不是全部。训练与验证损失行为确实很奇怪 - 翻转 class 预测,并轰炸与 刚刚训练 完全相同的数据集:
此外,BatchNormalization
训练与测试时间的输出差异很大(下图)
更新 2: 排除了所有其他怀疑:BatchNormalization 是罪魁祸首。使用带有 SELU 和 AlphaDropout 的自标准化网络 (SNN) 代替 BatchNormalization 会产生稳定且一致的结果。
我不小心遗漏了一个 non-standardized 样本(一批 32 个),sigma=52
- 这严重破坏了 BN
层; post-standardizing,我不再观察到训练模式和推理模式之间的明显差异 - 如果有的话,任何差异都很难发现。
另外,整个预处理过程非常错误,重新正确处理后,问题不再出现。作为调试提示,尝试确定任何特定训练数据集是否在推理过程中急剧改变层激活。