① BatchNormalization은 데이터의 평균을 0으로, 표준편차를 1로 분포시키는 것입니다.
각 계층에서 입력 데이터의 분포는 앞 계층에서 업데이트된 가중치에 따라 변합니다. 즉, 각 계층마다 변화되는 분포는 학습 속도를 늦출 뿐만 아니라 학습도 어렵게 합니다. 따라서 각 계층의 입력에 대한 분산을 평균 0, 표준편차 1로 분포시키는 것이 BatchNormalization입니다. BatchNormalization은 ‘8장 성능 최적화’에서 자세히 다룹니다.
다음은 합성곱 블록에 대한 코드입니다. 합성곱 블록도 아이덴티티 블록에 대한 코드와 크게 다르지 않습니다.
코드 6-20 합성곱 블록
def res_conv(x, s, filters):
x_skip = x
f1, f2 = filters
x = Conv2D(f1, kernel_size=(1,1), strides=(s,s), padding='valid',
kernel_regularizer=l2(0.001))(x)
x = BatchNormalization()(x)
x = Activation(activations.relu)(x) ------ 첫 번째 블록
x = Conv2D(f1, kernel_size=(3,3), strides=(1,1), padding='same',
kernel_regularizer=l2(0.001))(x)
x = BatchNormalization()(x)
x = Activation(activations.relu)(x) ------ 두 번째 블록
x = Conv2D(f2, kernel_size=(1,1), strides=(1,1), padding='valid',
kernel_regularizer=l2(0.001))(x)
x = BatchNormalization()(x) ------ 세 번째 블록
x_skip = Conv2D(f2, kernel_size=(1,1), strides=(s,s), padding='valid',
kernel_regularizer=l2(0.001))(x_skip)
x_skip = BatchNormalization()(x_skip) ------ 숏컷
x = Add()([x, x_skip])
x = Activation(activations.relu)(x)
return x