2017-06-15 94 views
0

即使我使用相同的數據集,我對培訓有較高的分類,但對驗證的分類較低。只有在使用批量標準化時纔會出現此問題。我是否正確實施?Keras:使用批次標準化在同一數據集上進行不同的培訓和驗證結果

代碼使用批標準化:

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 - ACC:1.0000 - val_loss:3.0321 - val_acc:0.5568

+0

這些結果有什麼奇怪的地方?訓練的準確性總是比測試更好;你有什麼理由期望泛化是簡單的嗎? – lejlot

+0

我正在測試它正在訓練的相同數據集。所以結果應該非常相似,而不是。 – mcudic

回答

0

您在第一(輸入)將批標準化層,這是最多的可能是一個錯誤。你爲什麼要這樣做?你的輸入是圖像,你很清楚如何規範你的輸入 - 事實上,這就是你在第一行所做的。再次應用規範化是沒有意義的。

批處理標準化應用於隱藏層,以便數據不會太大或太小。沒有簡單的通用方法來完成此操作,因此Sergey Ioffe and Christian Szegedy介紹了此特殊層。

+0

好的。我在第一層中取出了批量標準化。我仍然遇到同樣的問題。當我在相同的數據集上訓練和驗證/測試時,我的訓練結果比我的測試結果好得多。 – mcudic

+0

@mcudic你有沒有解決你的問題?你可以包括你使用的Keras和Tensorflow版本嗎?以及CUDA和CuDNN的版本? –

相關問題