keras batchnorm有着糟糕的测试表现

时间:2016-10-18 23:34:16

标签: neural-network normalization keras

在对训练数据进行交叉验证时,使用batchnorm可显着提高性能。但是(在对整个训练集进行重新训练之后),batchnorm层的存在完全破坏了模型对一个保持集的推广。这有点令人惊讶,我想知道我是否错误地实施了测试预测。

没有存在的batchnorm层的泛化很好(对于我的项目目标而言不够高,但对于这样一个简单的网络来说是合理的)。

我无法分享我的数据,但有没有人看到明显的实施错误?是否有应该设置为测试模式的标志?我无法在文档中找到答案,而且辍学(也应该有不同的培训/测试行为)按预期工作。谢谢!

代码:

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=10)
from keras.callbacks import ModelCheckpoint
filepath="L1_batch1_weights.best.hdf5" 
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='auto')

init = 'he_normal'

act = 'relu'

neurons1 = 80

dropout_rate = 0.5

model = Sequential()
model.add(Dropout(0.2, input_shape=(5000,)))
model.add(Dense(neurons1))
model.add(BatchNormalization())
model.add(Activation(act))
model.add(Dropout(dropout_rate)) 
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer="adam", metrics=["accuracy"])


my_model = model.fit(X_train, y_train, batch_size=128, nb_epoch=150, validation_data =(X_test, y_test),callbacks=[early_stopping, checkpoint]) 

model.load_weights("L1_batch1_weights.best.hdf5")

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print("Created model and loaded weights from file")

probs = model.predict_proba(X_test,batch_size=2925)
fpr, tpr, thresholds = roc_curve(y_test, probs)

1 个答案:

答案 0 :(得分:2)

来自docs:"在培训期间,我们使用每批次统计数据来规范化数据,在测试期间,我们使用在训练阶段计算的运行平均值。"

在我的情况下,培训批量大小为128.在测试时,我手动将批量大小设置为完整测试集的大小(2925)。

有意义的是,用于一个批量大小的统计数据显然与批量大小明显不同。

将测试批量大小更改为列车批量大小(128)可以产生更稳定的结果。我玩了预测批量大小以观察效果:预测结果对于任何批量大小+/- 3x的训练批量大小是稳定的,超过性能恶化。

在与load_weights()一起使用时,有一些讨论测试批量大小的影响以及使用batchnorm: https://github.com/fchollet/keras/issues/3423