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、-1]と[1,1]が得られますが、ガンマを乗算してベータを追加しても、同じ数を得ることはできません。また、私は4つのランダムな入力ベクトルでbatch_size = 4を試みましたが、私はまだ同じ数を取得します。 –
バッチ正規化では、平均と分散を計算しませんが、これらは(定数)パラメータです。このレイヤーを訓練しないので、それらのレイヤーの初期値は平均= 0、分散= 1です。 – YSelf
助けてくれてありがとう! –