Machine learning Keras:使用批标准化在同一数据集上获得不同的训练和验证结果

Machine learning Keras:使用批标准化在同一数据集上获得不同的训练和验证结果,machine-learning,tensorflow,keras,Machine Learning,Tensorflow,Keras,我在培训方面的分类较高,但在验证方面的分类较低,即使我使用的是相同的数据集。此问题仅在使用批处理规范化时发生。我是否正确地实施了它 使用批处理规范化的代码: train_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( directory = '../ImageFilter/Images/', target_size=(img_rows, img_

我在培训方面的分类较高,但在验证方面的分类较低,即使我使用的是相同的数据集。此问题仅在使用批处理规范化时发生。我是否正确地实施了它

使用批处理规范化的代码:

train_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
directory = '../ImageFilter/Images/',
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical',
shuffle=True)

model = Sequential()

model.add(Convolution2D(16,
kernel_size=(3, 3),
strides=(2,2),
activation='relu',
input_shape=(img_rows, img_cols, 3)))
model.add(BatchNormalization())
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics = ['accuracy'])
epochs = 100
patience = 6
n_images = 91
file_path = 'imageFilterCNN.hdf5'

checkpointer = ModelCheckpoint(file_path, monitor='val_acc', verbose=0, save_best_only=True)
earlystop = EarlyStopping(monitor='val_acc', patience=patience, verbose=0, mode='auto')
tboard = TensorBoard('./logs')

model.fit_generator(
train_generator,
steps_per_epoch=n_images// batch_size,
epochs=epochs,
callbacks=[checkpointer, earlystop, tboard],
validation_data=train_generator,
validation_steps=n_images// batch_size)
产出: 纪元15/100 11/11[====================================]-2s-损失:0.0092-会计科目:1.0000- val_损失:3.0321-val_acc:0.5568


您正在第一(输入)层上应用批处理规范化,这很可能是一个错误。你为什么要这样做?您的输入是图像,您非常清楚如何规范您的输入-事实上,这就是您在第一行中所做的。再次应用规范化是没有意义的


批量规范化应用于隐藏层,以便数据不会变得太大或太小。没有一种简单、通用的方法可以做到这一点,因此引入了这个特殊的层。

好的。我在第一层中取出了批处理规范化。我仍然遇到同样的问题。当我在同一个数据集上进行训练和验证/测试时,我的训练结果比我的测试结果要好得多。@mcudic你解决过你的问题吗?你能包括你使用的Keras和Tensorflow版本吗?以及CUDA和CuDNN的版本?这些结果有什么奇怪之处?训练的准确性总是比测试好;你有什么理由期望泛化是简单的吗?我在同一个数据集上进行测试,它是在同一个数据集上进行训练的。因此,结果应该相当相似,而事实并非如此。