2

我正在研究一個網絡,這個網絡可以計算剛剛結束的Kaggle比賽的無人機圖像中海獅的數量。海獅也有不同的類別(成年男性,成年女性等)。請幫助我瞭解爲什麼向此網絡添加丟失功能無效。加入丟失之後,我的神經網絡比以前更加適應了。這是怎麼回事?

Keras中的網絡體系結構複製如下。最初,我選擇了在Imagenet上預訓練的前15層VGG16。除此之外,我還設置了七層:卷積,RELU,池化,卷積,RELU,池化和全局平均池化以輸出計數。這個模型在訓練過程中過度使用數據,最終以400或500(優秀分數)的損失結束,但是〜850(正常)的失敗確認損失。然後,我在VGG層之後添加了50%的缺失,並且在添加了每個層之後再添加了50%。這是根據Stanford cs231 online course notes - 「在所有圖層之後應用dropout也是很常見的,p = 0.5的值是合理的默認值。」經過一段時間的訓練後,訓練損失降到了800左右,但仍然維持在1200+以上(不是很好),這在訓練中早已達到了。

爲什麼不添加丟失工作?有什麼其他的東西,比如架構,任務或者優化器在某種程度上是什麼問題?

編輯另外,在保持校驗集中只有〜800個訓練圖像和另外150個訓練圖像,但我還使用水平翻轉,垂直翻轉和180度旋轉的數據增強。

base_model = VGG16(weights='imagenet', include_top=False) 

x = base_model.layers[15].output 
x = Dropout(0.5)(x) 

x = Conv2D(128, kernel_size=(3, 3), padding='same')(x) 
x = Dropout(0.5)(x) 
x = Activation('relu')(x) 
x = Dropout(0.5)(x) 
x = MaxPooling2D(pool_size=(2, 2))(x) 
x = Dropout(0.5)(x) 

x = Conv2D(n_classes, kernel_size=(3, 3), padding='same')(x) 
x = Dropout(0.5)(x) 
x = Activation('relu')(x) 
x = Dropout(0.5)(x) 
x = MaxPooling2D(pool_size=(2, 2))(x) 
x = Dropout(0.5)(x) 

x = GlobalAveragePooling2D()(x) 

model = Model(inputs=base_model.input, outputs=x) 
for layer in base_model.layers: 
    layer.trainable = False 
model.compile(loss=keras.losses.mean_squared_error, 
     optimizer= keras.optimizers.Adadelta()) 
+0

您是否還在驗證集中使用了數據增強功能? (也許增強使訓練集與驗證集有所不同?) –

+0

嗯,我沒有,讓我在接下來的一個小時左右嘗試一下,然後找到結果。話雖如此,我不認爲任何這些變化都會導致圖像與原始訓練集有區別,除非輪換做了一些奇怪的事情。 –

+1

爲什麼要爲每個Conv2D圖層添加兩次Dropout? (x) x =激活('relu')(x) x =退出(0.5)(x)'這肯定會造成麻煩,因爲在訓練期間你可能會隨機擦除幾乎所有的神經元。 – petezurich

回答

1

我建議你刪除已添加的每個卷積層冗餘差:

x = Conv2D(128, kernel_size=(3, 3), padding='same')(x) 
x = Dropout(0.5)(x) # <-- redundant, remove this 
x = Activation('relu')(x) 
x = Dropout(0.5)(x) <-- remove this as well 
x = MaxPooling2D(pool_size=(2, 2))(x) 
x = Dropout(0.5)(x) 

此外,我建議檢查你的鍛鍊履歷要麼model.fit史( )或Tensorboard檢查是否有任何異常情況可以解釋您的損失異常行爲。