2

我想在Keras中使用BatchNorm。培訓準確性隨着時間的推移而增加從12%到20%,緩慢但確定。 然而,測試精度從12%降至0%。隨機基線是12%。Keras BatchNorm:訓練準確性提高,而測試準確性降低

我非常認爲這是由於蝙蝠科層(剔除蝙蝠科層導致測試精度爲〜12%),這可能不會初始化伽馬和β參數。在應用蝙蝠chnorm時,我必須考慮什麼特別的東西?我真的不明白還有什麼可能會出錯的。我有以下模式:

模型=順序()

model.add(BatchNormalization(input_shape=(16, 8))) 
model.add(Reshape((16, 8, 1))) 

#1. Conv (64 filters; 3x3 kernel) 
model.add(default_Conv2D()) 
model.add(BatchNormalization(axis=3)) 
model.add(Activation('relu')) 

#2. Conv (64 filters; 3x3 kernel) 
model.add(default_Conv2D()) 
model.add(BatchNormalization(axis=3)) 
model.add(Activation('relu')) 

... 

#8. Affine (NUM_GESTURES units) Output layer 
model.add(default_Dense(NUM_GESTURES)) 
model.add(Activation('softmax')) 


sgd = optimizers.SGD(lr=0.1) 
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 

default_Conv2D和default_Dense定義如下:

def default_Conv2D(): 
    return Conv2D(
     filters=64, 
     kernel_size=3, 
     strides=1, 
     padding='same', 
     # activation=None, 
     # use_bias=True, 
     # kernel_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None), #RandomUniform(), 
     kernel_regularizer=regularizers.l2(0.0001), 
     # bias_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None), # RandomUniform(), 
     # bias_regularizer=None 
    ) 

def default_Dense(units): 

    return Dense(
     units=units, 
     # activation=None, 
     # use_bias=True, 
     # kernel_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None),#RandomUniform(), 
     # bias_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None),#RandomUniform(), 
     kernel_regularizer=regularizers.l2(0.0001), 
     # bias_regularizer=None 
    ) 

回答

0

似乎有什麼東西與凱拉斯本身打破。

一個天真

pip install git+git://github.com/fchollet/keras.git --upgrade --no-deps 

的伎倆。

@wontonimo,非常感謝你真的很棒的回答!

+0

很高興您能找到它! – Wontonimo

3

的問題過度擬合

這是你的第一個2個觀察的支持:

隨着時間的推移
  1. 的訓練精度提高。從12%到20%,..測試精度下降。然而,從12%至0%
  2. 去除〜12%的測試精度batchnorm層結果

第一個語句告訴我,你的網絡記住訓練集。第二種說法告訴我,當你阻止網絡記憶訓練集(或者甚至學習)時,它會停止記憶的錯誤。

過度配合有幾種解決方案,但這是一個比這篇文章大的問題。請把下面的列表作爲「頂」列表並不詳盡:

  • 只是最終完全連接層前面加上正則像
  • 加上矩陣權重L1或L2正則
  • 添加一個正則像 CONV
  • 之間
  • 您的網絡可能有太多的自由參數。嘗試將圖層減少到1個CONV,並且每次重新訓練和測試時再添加一個圖層。在精度

    作爲一個側面說明

增長緩慢,你暗示,你的準確度不說緩慢而穩步地增長儘可能快地等。我有,當我已經做了所有的以下步驟

  • 改變你的損失函數是在小批量的所有項目的所有預測的平均損失了巨大的成功。這使得你的損失函數獨立於你的批量大小,你會發現,如果你改變批量大小,並且你的損失函數隨之改變,那麼你將不得不改變你的學習速率(SGD)。
  • 您的損失是單個數字,即所有預測類別和所有樣本的損失平均值,因此使用1.0的學習率。無需再擴展。
  • 使用tf.train.MomentumOptimizer with learning_rate = 1.0 and momentum = 0.5。 MomentumOptimizer已被證明是比GradientDescent更可靠
+0

非常感謝您的回答!但是,問題是如果我將它部署在tensorflow上,那麼完全相同的代碼就可以工作。我是否正確使用BatchNorm?或者是否有任何已知的錯誤? – DaveTheAl

+0

當你說如果我在tensorflow *上部署它,那麼你在哪裏部署它? – Wontonimo

+0

對不起,我應該更清楚..我以前的實現是純張量流。現在我用一個tensorflow後端將它部署在Keras上。張量流模型具有**完全相同的結構。之前我也遇到過這個問題,結果發現tensorflow中的變量需要以特殊的方式初始化(​​如[here](https://www.tensorflow.org/versions/master/api_docs/python/tf/)層/ batch_normalization))。所以我懷疑我必須在凱拉斯初始化一些東西,但這似乎並不是這樣的。 – DaveTheAl

相關問題