NeuroWhAI의 잡블로그

[TensorFlow] batch_normalization 사용 시 주의사항 본문

개발 및 공부/라이브러리&프레임워크

[TensorFlow] batch_normalization 사용 시 주의사항

NeuroWhAI 2018. 2. 10. 12:43


이전글에서 DCGAN을 만들면서 tf.layers.batch_normalization을 사용하게 됬는데
training 옵션이 False일땐 잘 되면서 True일땐 학습하지 않은 결과만 못한 출력을 내더라고요.

이것저것 검색하다가 결국 공식 문서에 해답이 있다는걸 알았습니다.


training시에 moving_mean과 moving_variance는 수동으로 업데이트 해줘야한다고 합니다.
기본적으로 갱신연산(update op)들은 UPDATE_OPS 키에 속하고
이걸 학습연산(train op)의 종속성에 추가해주면 된다고 합니다.
그 방법이 위 사진의 코드에 해당합니다.

(신경망 구현 코드를 다 작성한 뒤)
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
로 갱신연산을 가져올 수 있고
train_op = optimizer.minimize(loss)와 비슷한 기존의 최적화 함수를 생성하는 부분을
with tf.control_dependencies(update_ops):
아래에 넣으면 train_op는 update_ops의 연산이 끝난 후에 연산되게 됩니다.

이걸 적용하고 나니까 False, True 상관없이 결과가 잘 나오더라고요.
아주 조아용 홓홓

아, 주의하실게 있는데 위 방법을 적용하고 나면 train_op의 연산에 필요한 placeholder가 더 추가될 수 있습니다.
왜냐하면 train_op를 연산하면 이것만 연산되는게 아니라 종속성으로 지정한 update_ops도 연산되기 때문이죠.
그래서 update_ops 연산에 필요한 placeholder도 feed_dict에 넣어주셔야 됩니다.

그럼 이만!




Comments