<미니배치 표준편차>
다음 혁신은 미니배치 표준편차(mini-batch standard deviation)이다. 이를 자세히 알아보기 전에 모드 붕괴를 생각해보자. 모드 붕괴는 GAN이 몇 개의 좋은 샘플만 만드는 방법이나 이들의 순서를 조금 바꾸기만 할 때 발생한다. 일반적으로 한 사람의 얼굴이 아니라 실제 데이터셋에 있는 모든 사람의 얼굴을 생성하기 원한다.
따라서 캐라스와 연구진은 판별자에게 샘플이 충분히 다양한지 알려주는 방법을 만들었다. 간단하게 요약하면 판별자를 위해 한 개의 스칼라 통계 값을 추가로 계산한다. 이 통게값은 생성자가 만들거나 실제 데이터에서 온 미니배치에 있는 모든 픽셀의 표준편차이다. 판별자는 평가할 배치 이미지에서 표준편차가 낮다면 이 이미지는 가짜라고 학습한다. 진짜 데이터는 분산이 크기 때문이다. 따라서 생성자는 판별자를 속이기 위해서는 생성 샘플의 분산을 늘릴 수밖에 없다.
def minibatch_std_layer(layer,group_size=4):
'''
층의 미니배치 표준편차를 계산한다
층의 데이터 타입은 float32로 가정한다. 그렇지 않으면 타입 변환이 필요하다.
'''
group_size=K.backend.minimum(group_size,tf.shape(layer)[0])
# 미니배치는 group_size로 나눌 수 있거나 group_size보다 같거나 작아야 한다.
shape=list(K.int_shape(input))
# 간단하게 쓰기 위해 크기 정보를 따로 저장한다. 그래프 실행 전에는 일반적으로 배치 차원이 none이기 때문에 tf.shape에서 이 크기를 얻는다.
shape[0]=tf.shape(input)[0]
minibatch=K.backend.reshape(layer,group_size,-1,shape[1],shape[2],shape[3])
# 미니배치 수준에서 연산하기 위해 크기를 바꾼다. 이 코드는 층이 [그룹(G),미니배치(M),너비(W),
# 높이(H),채널(C)]라고 가정한다.
minibatch-=tf.reduce_mean(minibatch,axis=0,keeppdims=True)
# [M,W,H,C] 그룹의 평균을 계산한다
minibatch = tf.reduce_mean(K.backend.square(minibatch),axis=0)
# 분산을 계산
minibatch=K.backend.square(minibatch + 1e-8)
# 표준편차를 계산
minibatch=tf.reduce_mean(minibatch,axis=[1,2,3],keepdims=True)
# 특성 맵을 평균하여 [M,1,1,1] 픽셀을 얻는다
minibatch=K.backend.tile(minibatch,[group_size,1,shape[2],shape[3]])
return K.backedn.concatenate([layer,minibatch],axis=1) # 새로운 특성 맵을 추가한다
< 균등 학습률>
<생성자의 픽셀별 특성 정규화>
'GAN > 이론' 카테고리의 다른 글
9. SGAN - 이론 (0) | 2021.06.28 |
---|---|
8. 텐서플로 허브를 사용한 실습 (0) | 2021.06.27 |
6. ProGAN - 주요한 혁신들(1) (0) | 2021.06.27 |
8. 훈련 노하우 (0) | 2021.06.26 |
7. 훈련의 어려움 (0) | 2021.06.24 |