0

Je voudrais construire un DCGAN pour MNIST par moi-même dans TensorFlow. Cependant, j'ai du mal à trouver comment je devrais mettre en place la fonction de perte pour le générateur. Dans un Keras DCGAN implementation l'auteur a utilisé un peu "solution de contournement" pour ce problème: il a simplement construit 3 modèles. Le générateur (G), le discriminateur (D) et le troisième, où il vient de combiner G avec D, tout en mettant la capacité de train de D à faux là. De cette façon, il peut alimenter D avec des images réelles + images générées pour former D et former le modèle combiné G + D, parce que la perte de D est propagée à G, puisque D ne peut pas être entraîné dans le G + D modèle combiné.TensorFlow MNIST DCGAN: comment configurer la fonction de perte?

Dans TensorFlow, j'ai déjà construit G et D. Formation D est relativement simple, puisque j'ai juste besoin de combiner un lot d'images réelles de formation MNIST avec ceux générés et appeler op de formation:

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

L'op de formation dans cet exemple est un cross entropy binaire:

tf.losses.softmax_cross_entropy(y, D_out) 

... mais comment est-ce que j'aurais mis en place la fonction de perte pour G, quand je n'ai pas un modèle "empilé", combinant "G et D" au modèle unique, troisième?

Je sais que je dois générer un lot d'images avec G, les alimenter en D et ensuite je peux obtenir la perte de D ... cependant, la sortie de G est de forme (batch_size, 28, 28, 1). Comment pourrais-je mettre en place une fonction de perte pour G à la main?

Sans le « G et D » modèle -Incorporant « solution » pour cela, je dois propager la perte de D, qui a une forme de sortie de (batch_size, 1) à la couche de sortie de G.

Si G serait faire une certaine classification par exemple, ce ne serait pas si difficile à comprendre ... mais G produit des images. Ainsi, je ne peux pas mapper directement la perte de D sur la couche de sortie de G.

Dois-je configurer un troisième modèle combinant G + D? Ou y a-t-il un moyen de calculer la perte de G à la main?

Toute aide est très appréciée :)

Répondre

3

Dans la formation de l'étape du générateur, vous pouvez penser que le réseau implique aussi le discriminateur. Mais pour faire la rétropropagation, vous ne considérerez que les poids des générateurs. Une bonne explication est trouvée here.

Comme mentionné dans original paper, le coût de discriminateur est:

enter image description here

Et le coût du générateur est:

enter image description here

Bien sûr, vous n'avez pas besoin de le calculer par main. Tensorflow le gère déjà. Pour faire tout le processus, vous pouvez mettre en œuvre les éléments suivants:

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)) 

où D_real, D_fake et D_sample sont les dernières couches de votre réseau. Ensuite, vous pouvez mettre en œuvre le processus de formation par la méthode standard:

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)) 

Et il suffit d'exécuter les solveurs dans une session.