GAN

简单例子,拟合一维高斯分布:

预训练:一上来直接训练生成器和判别器,效果差,所以先预训练判别器。对一个输入d,用它在目标分布上的概率密度做label,  判别器输出和label的MSE做损失函数;

生成器的输入z,是某区间上的均匀分布(代码里使用linspace是很不恰当的),输出是G; 

判别器的输入真实数据x==>对应输出D1, 输入生成器过来的G==>对应输出D2;  Tensorflow实现上,D1和D2这两个判别器共享相同的参数(其实就是同一个网络,不同的输入对应不同的输出);

1. 判别器损失函数:-tf.log(self.D1) - tf.log(1 - self.D2)   (真实数据输出D1越接近1越好,假数据输出D2越接近0越好)

2. 生成器损失函数:-tf.log(self.D2)  (假数据输出D2越接近1越好)

训练:采样一组x和一组z, 输入到1网络里训练更新一次判别器; 采样一组z, 输入到2网络里训练更新一次生成器(损失函数里只有D2,因此不需要x做输入);(本例子的实现是分成这2次采样的,我觉得其实可以一次采样就可以既更新判别器又更新生成器的,可能tensorflow上不好实现)

 

DCGAN:

生成器:输入均匀分布z(100维),经过全连接层,变为数千维向量,reshape成4*4*512,反卷积->BN->Relu, 如此多次后,最后一层反卷积后成64*64*3过tanh得到输出;反卷积:增大图片大小,减少通道数;BN:很重要!

判别器:真实数据64*64*3图像也要先归一化到(-1, +1)区间内(和生成器输出的图片归一化到相同范围);卷积->BN->LeakyRelu;最后一层卷积->拉直->过全连接->sigmoind,得到输出(1个数)

对判别器而言,真实数据的label都是1,假数据的label都是0;对生成器而言,假数据的label都是1;都是用和交叉熵损失函数;

训练:先用真实数据和假数据做输入更新判别器;再用同样这批假数据做输入更新生成器;

更新判别器的时候,通过制定"d_"开头的变量们,只更新判别器而不更新生成器;

更新生成器的时候,通过制定"g_"开头的变量们,只更新生成器而不更新判别器;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值