鑑於輸入值[1, 5]
和標準化他們應該產生類似[-1, 1]
if I understand correctly,因爲BatchNormalization層給出意想不到的輸出值
mean = 3
var = 4
result = (x - mean)/sqrt(var)
然而這個最小示例
import numpy as np
import keras
from keras.models import Model
from keras.layers import Input
from keras.layers.normalization import BatchNormalization
from keras import backend as K
shape = (1,2,1)
input = Input(shape=shape)
x = BatchNormalization(center=False)(input) # no beta
model = Model(inputs=input, outputs=x)
model.compile(loss='mse', optimizer='sgd')
# training with dummy data
training_in = [np.random.random(size=(10, *shape))]
training_out = [np.random.random(size=(10, *shape))]
model.fit(training_in, training_out, epochs=10)
data_in = np.array([[[[1], [5]]]], dtype=np.float32)
data_out = model.predict(data_in)
print('gamma :', K.eval(model.layers[1].gamma))
#print('beta :', K.eval(model.layers[1].beta))
print('moving_mean:', K.eval(model.layers[1].moving_mean))
print('moving_variance:', K.eval(model.layers[1].moving_variance))
print('epsilon :', model.layers[1].epsilon)
print('data_in :', data_in)
print('data_out:', data_out)
產生以下輸出:
gamma : [ 0.80644524]
moving_mean: [ 0.05885344]
moving_variance: [ 0.91000736]
epsilon : 0.001
data_in : [[[[ 1.]
[ 5.]]]]
data_out: [[[[ 0.79519051]
[ 4.17485714]]]]
因此它是[0.79519051, 4.17485714]
而不是[-1, 1]
。
我看了看source,這些值似乎被轉發到tf.nn.batch_normalization。而這個looks的結果應該是我除外,但顯然不是。
那麼如何計算輸出值?
真棒,非常感謝。當'center = True'時,你能否告訴我beta在公式中的位置?我的猜測是'output = gamma *(input - moving_mean)/ sqrt(moving_variance)+ beta',但是當我[啓用中心](https://ideone.com/TNRlFH)[output](https:// ideone.com/d3rROd)不匹配。 –
應該如您所說根據tensorflow給出[this](https://www.tensorflow.org/api_docs/python/tf/nn/batch_normalization)。 [Keras](https://keras.io/layers/normalization/)看起來好像它可以在他們的文檔中執行'output = gamma *((input - moving_mean)/ sqrt(moving_variance)+ beta)'。然而,沒有一個完全符合,我不知道爲什麼... – gdelab
我發現這個問題。我們沒有使用epsilon。完全正確的公式是'result = gamma *(input - moving_mean)/ sqrt(moving_variance + epsilon)+ beta'。 –