在前面两篇中,我们完成了生成网络和判别网络的构造,构造完成之后,我们构造一个损失函数,使得最终两个网络能够相互打架,相互进步
我们希望,对于真实数据,通过判别网络D后,能够认定为1(真实),而对于生成的数据,我们则希望其通过判别网络D后,认定为0(假的)
GAN损失函数
判别网络损失函数
1 |
self.loss_d = tf.reduce_mean(-tf.log(self.D1) - tf.log(1 - self.D2)) #希望 D1--1 D2--0 |
生成网络损失函数
1 |
self.loss_g = tf.reduce_mean(-tf.log(self.D2)) #生成网络损失函数 希望D2--1 |
生成网络的目的是骗过判别网络,希望生成的数据再判别网络下被判别为1
求解器
1 2 3 4 5 6 7 |
self.d_pre_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='D_pre') self.d_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Disc') self.g_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Gen') self.opt_d = optimizer(self.loss_d, self.d_params, self.learning_rate) #不断的优化loss self.opt_g = optimizer(self.loss_g, self.g_params, self.learning_rate) |
损失函数构造完成后,先对之前构造的三个模型进行初始化
紧接着,我们就可以通过构造梯度下降求解器,不断的优化loss_d和loss_g
即可得到两组参数模型,一组是生成网络的参数,另一组是判别网络的参数。我们最终就可利用生成网络的参数去生成数据
定义完两个求解器后,我们至此完成了三个网络的定义