为了账号安全,请及时绑定邮箱和手机立即绑定

手把手教你搭建一个GAN

标签:
Java Python

一.GAN网络机理

        首先先从一幅图入手,如图1所示:

图1. GAN作用机理

        假设在训练开始时,真实样本分布生成样本分布以及判别模型分别是图中的黑线、绿线和蓝线,其中噪声就是图中的z,目的就是为了生成绿线。

        第二小图所示,固定生成样本,先让判断器判断准,以蓝线和黑线交点为起点,以右判断为真实,以左判断为假,感觉自己很聪明能够判断真假。

        然后来到第三小图,生成器去和真实样本数据做一个拟合,从而误导判决器,但判决器还是能辨认出来,生成器骗不了它。

        第四小图为,当生成器的数据概率分别和真实数据概率分布重合时,判决器从此就变得傻了,不能对其辨别真伪,判决器失败生成器成功,以假乱真。



二.分析问题

        图2为GAN流程图:

图2 GAN大体流程

          我们有了上述思路和流程图,就可以来确定问题去实现它了~(明确几个问题去解决):

        1.  目标函数该如何设定? 

        2.  如何生成图片? 

        3.  G(判决器)和D(生成器)应该如何设置? 

        4.  如何进行训练?



1.GAN目标函数确定

           判别模型的目标函数如下:

判别模型目标函数

        1. 整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。

        2. D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的。所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。

        3. G的目的:G应该希望自己生成的图片越接近真实越好。

        4. D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)

         5. trick:为了前期加快训练,生成器的训练可以把log(1-D(G(z)))换成-log(D(G(z)))

2.GAN图片生成   训练方法

    以下为论文原文:

刚开始看是不是感觉不知如何下手,那么接下来换一种方式来看待它。

下图为形象化的GAN训练方案

形象化的训练方案

input1为真实数据;input2为生成数据

对于判决器而言,其标签认定,对于input1的输出正常应该为“1”,input2的输出正常应该为“0”

第一步,首先把左图的“T”(生成器)固定住,生成一批样本,然后和真实数据一块送至判决器判决,这步为训练的判决器,希望判决器能把它俩区分开,分别打上“1”和“0”标签

第二步,先把右图的“T”(判决器)固定住了,然后调节生成器,让生成的数据也为“1”,去把判决器混淆。这步为训练生成器。

注:我们所有的图片都是靠噪音来生成的


本文中展示的脚本都添加了注释,若难以理解,可参见keras文档

具体代码,参见github源码


3.GAN图片生成  生成器G


设置生成器G

以下是生成器G的脚本:


4.GAN图片生成  判别器D

参见github源码:https://github.com/jacobgi

设置判别器D

以下是判别器D的脚本:


5.GAN图片生成  辅助函数

把判别器D固定,使其能够调整生成器G。


6.GAN图片生成  训练

然后就可以开始进行训练了~~~


7.GAN图片生成  生成

这就形成了噪音经过一个G网络,生成了一个图像,这幅图像就成功骗过了判决器D。


三.总结

   以上就是浅谈了GAN网络的原理,并且搭建了一个原始的GAN网络。希望和大家共同努力进步。

   感兴趣的小伙伴~可以实现CGAN制定类的输出,DCGAN稳定训练网络,infoGAN实现等~~~



作者:hahazhen
链接:https://www.jianshu.com/p/51f969b7922f


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 1
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消