0

TensorFlow에서 MNIST에 대해 DCGAN을 직접 작성하고 싶습니다. 그러나 나는 발전기의 손실 기능을 어떻게 설정해야하는지 알아 내려고 애 쓰고있다. Keras DCGAN implementation에서 저자는이 문제에 대한 약간의 "해결 방법"을 사용했습니다. 그는 단순히 3 가지 모델을 만들었습니다. 생성기 (G), 판별 자 (D) 및 세 번째 단계. 여기에서 G와 D를 결합한 상태에서 D의 열차 능력을 거짓으로 설정합니다.TensorFlow MNIST DCGAN : 손실 기능을 설정하는 방법?

D는 D가 G + D에서 학습 할 수 없기 때문에 D의 손실이 G로 전달되므로 실제 이미지와 생성 된 이미지를 D에 공급하여 D를 훈련하고 G + D 결합 모델을 학습 할 수 있습니다. 결합 모델.

TensorFlow에서 저는 G와 D를 이미 구축했습니다.

session.run(D_train_op, 
      feed_dict={x: batch_x, y: batch_y}) 

이 예에서 훈련 연산은 이진 cross entropy :

tf.losses.softmax_cross_entropy(y, D_out) 
방금 ​​생성 한 사람과 실제 MNIST 훈련 이미지의 배치를 결합하고 훈련 연산을 호출 할 필요가 있기 때문에 교육 D는 비교적 간단하다

...하지만 "G와 D"를 하나의 세 번째 모델로 결합한 "겹쳐진"모델이 없으면 G에 대한 손실 함수를 어떻게 설정합니까?

나는 G로 이미지 배치를 만들어야하고, D로 먹여야하고 D의 손실을 얻을 수 있다는 것을 알고있다. 그러나 G의 출력은 모양이 (batch_size, 28, 28, 1)이다. 손으로 G의 손실 함수를 어떻게 설정합니까? 이에 대해 "G와 D"-combined 모델 "해결 방법"없이

, 나는 G.

의 출력 층에

G는 것인지를 (batch_size, 1)의 출력 형태를 갖는다 D의 손실을 전파해야 예를 들어, 어떤 분류를해라. 이것은 알아 내기가 어렵지는 않을 것이다. 그러나 G는 이미지를 출력한다. 따라서 D의 손실을 G의 출력 레이어에 직접 매핑 할 수는 없습니다.

G + D를 결합한 세 번째 모델을 설정해야합니까? 아니면 손으로 G 손실을 계산할 수있는 방법이 있습니까?

이 어떤 도움을 매우 높이 평가한다 : 발전기 단계 훈련에서

답변

3

, 네트워크가 너무 판별을 포함 것을 생각할 수 있습니다. 그러나 역 전파를 수행하려면 발전기 가중치 만 고려하십시오. 좋은 설명은 here입니다.

enter image description here

그리고 발전기 비용은 다음과 같습니다 :

original paper에서 언급 한 바와 같이

, 판별 비용은

물론

enter image description here

, 당신하여 계산 할 필요가 없습니다 손. Tensorflow는 이미 그것을 처리합니다. 모든 과정을 수행하려면 다음을 구현할 수 있습니다 D_real, D_fake 및 D_sample 네트워크의 마지막 층이다

G_sample = generator(z) 
D_real = discriminator(X) 
D_fake = discriminator(G_sample) 

D_loss = tf.reduce_mean(-tf.log(D_real)-tf.log(1-D_fake)) 
G_loss = tf.reduce_mean(-tf.log(D_fake)) 

.

D_solver = (tf.train.AdamOptimizer(learning_rate=0.0001,beta1=0.5) 
      .minimize(D_loss, var_list=theta_D)) 
G_solver = (tf.train.AdamOptimizer(learning_rate=0.0001,beta1=0.5) 
      .minimize(G_loss, var_list=theta_G)) 

을 그리고 세션에서 해법을 실행 단지 : 그런 다음 당신은 표준 방법에 의해 교육 과정을 구현할 수 있습니다.

관련 문제