GAN/이론

7. ProGAN - 주요한 혁신들(2)

jwjwvison 2021. 6. 27. 21:55

<미니배치 표준편차>

다음 혁신은 미니배치 표준편차(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