Neural network keras batchnorm具有糟糕的测试性能

Neural network keras batchnorm具有糟糕的测试性能,neural-network,normalization,keras,Neural Network,Normalization,Keras,在对训练数据进行交叉验证期间,batchnorm的使用显著提高了性能。但是(在对整个训练集进行重新训练后),batchnorm层的存在完全破坏了模型对保持集的泛化。这有点令人惊讶,我想知道我是否实现了错误的测试预测 不存在batchnorm层的泛化是很好的(对于我的项目目标来说不够高,但是对于这样一个简单的网络来说是合理的) 我无法共享数据,但有人看到明显的实现错误吗?是否有应设置为测试模式的标志?我在文档中找不到答案,辍学者(也应该有不同的训练/测试行为)的表现与预期一样。谢谢 代码: 来自:

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

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

我无法共享数据,但有人看到明显的实现错误吗?是否有应设置为测试模式的标志?我在文档中找不到答案,辍学者(也应该有不同的训练/测试行为)的表现与预期一样。谢谢

代码:

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

在我的案例中,培训批量是128。在测试时,我已经手动将批量大小设置为完整测试集的大小(2925)

一个批次大小的统计数据显然与显著不同的批次大小无关,这是有道理的

将试验批量更改为序列批量(128)可产生更稳定的结果。我玩了w/预测批次大小来观察效果:对于任何批次大小+/-3倍的训练批次大小,预测结果都是稳定的,超出这个范围,性能就会恶化

在与load_weights()一起使用时,对测试批次大小以及使用BATCHTNORM的影响进行了一些讨论:

如果您阅读批处理文件的标记,您会看到它是关于在Windows上复制文件等的。@Lakes,您的评论与问题有何关联?我编辑了您的问题并删除了批处理文件标记。它是WINDOWS的shell脚本语言。与神经网络无关。包含批处理文件标记是无意的。谢谢。推理时的批量大小对推理输出绝对没有影响。
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)