2017-11-30 8 views
1

IはBatchNormalizationがkerasでどのように動作するかを知りたいので、私はコードを書く:ケラスのバッチ正規化の仕組みは?

X_input = keras.Input((2,)) 
X = keras.layers.BatchNormalization(axis=1)(X_input) 
model1 = keras.Model(inputs=X_input, outputs=X) 

入力は、2つのdimenstionsベクターのバッチであり、軸= 1に沿って正規化し、出力を印刷:

a = np.arange(4).reshape((2,2)) 
print('a=') 
print(a) 
print('output=') 
print(model1.predict(a,batch_size=2)) 

と出力されます:

a= 
array([[0, 1], 
    [2, 3]]) 
output= 
array([[ 0.  , 0.99950039], 
    [ 1.99900079, 2.9985013 ]], dtype=float32) 

私は結果を把握することはできません。私が知る限り、バッチの平均は([0,1] + [2,3])/ 2 = [1,2]でなければなりません。varは1/2 *(([0,1] - [1,2])^ 2 +([2,3] - [1,2])^ 2)= [1,1]。最後に、(x-mean)/ sqrt(var)で正規化すると、結果は[-1、-1]と[1,1]です。どこが間違っていますか?

答えて

1

BatchNormalizationは、平均を差し引いて分散で除算し、係数γとオフセットβを適用します。 これらのパラメータが実際にはバッチの平均と分散になる場合、結果は分散1でゼロに集中します。

しかし、これらはありません。訓練することができkeras重みとしてBatchNormalization layer店これらは、moving_meanmoving_varianceベータガンマと呼ばれます。これらは、ベータ= 0ガンマ= 1moving_mean = 0moving_variance = 1として初期化されます。列車ステップがないため、BatchNormは値を変更しません。

入力値を正確に取得できないのはなぜですか?分散に追加される別のパラメータイプシロン(少数)があるためです。したがって、すべての値は1 +εで除算され、入力値より少し下がってしまいます。

+0

入力値が変更されない理由はまだ分かりません。正規化では、[-1、-1]と[1,1]が得られますが、ガンマを乗算してベータを追加しても、同じ数を得ることはできません。また、私は4つのランダムな入力ベクトルでbatch_size = 4を試みましたが、私はまだ同じ数を取得します。 –

+0

バッチ正規化では、平均と分散を計算しませんが、これらは(定数)パラメータです。このレイヤーを訓練しないので、それらのレイヤーの初期値は平均= 0、分散= 1です。 – YSelf

+0

助けてくれてありがとう! –