2017-11-30 9 views
1

내가 BatchNormalization가 keras 작동 방법을 알고 싶어요, 그래서 코드 쓰기 :케라의 일괄 정규화는 어떻게 작동합니까?

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

입력이 두 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을 중심으로 중심에 위치합니다.

하지만 그렇지 않습니다. moving_mean, moving_variance, 베타감마이라고 훈련 될 수있는 가중치 등의 keras BatchNormalization layer 저장이. 그들은 베타 = 0, 감마으로 초기화 = 1, moving_mean = 0moving_variance = 1. 열차 단계가 없으므로 BatchNorm은 값을 변경하지 않습니다.

그럼 입력 값을 정확히 입력하지 않으시겠습니까? 다른 매개 변수 엡실론 (작은 수)이 있기 때문에 분산에 추가됩니다. 따라서 모든 값은 1 + 엡실론으로 나뉘며 입력 값보다 약간 아래로 끝납니다.

+0

입력 값이 변경되지 않는 이유는 아직도 이해할 수 없습니다. 정규화에서 [-1, -1]과 [1,1]을 얻습니다. 감마를 곱해서 베타를 추가하더라도 동일한 수를 얻을 수 없습니다. 또한, batch_size = 4를 4 개의 무작위 입력 벡터로 시도했지만 여전히 동일한 수를 얻습니다. –

+0

BatchNormalization은 사용자와 마찬가지로 평균 및 분산을 계산하지 않지만 이는 (상수) 매개 변수입니다. 이 레이어를 트레이닝하지 않으므로 초기 값은 평균 = 0이고 분산은 1입니다. – YSelf

+0

도움에 감사드립니다! –