Context-Conditional GAN (CCGAN) 猜猜我是谁
学习资料:
- 我制作的GAN简介短片
- 我制作的看图
说画
的GAN - 论文 Semi-Supervised Learning with Context-Conditional Generative Adversarial Networks
- 本节代码
- 代码有我自己定义的依赖utils.py, visual.py, mnist_ds.py
怎么了¶
在经典GAN的领域里,都是拿着一些随机的或数值的,或类别的输入,让 GAN 来对应着生成图片。 比如 ACGAN,CGAN, StyleGAN 他们主要都是以随机数字输入,来生成图片。 但是这就完了吗?肯定不是啊,既然输入可以是数值,那也可以是图片等其他信息呀。 我在这个短视频中具体介绍了 GAN 的另一种奇妙用法。
这次介绍的是 CCGAN,这是一种对遮掩部分的创作,如果用一句话来描述 CCGAN: 让你遮,反正我能看透你。 就冲着这句话,已成功让包括我在内的无数宅男开始YY~反正我是想到了其中的大用途,哇哈哈哈。
莫烦只搞科学严肃正经
的教学课,你用这些技术做什么,我就不干涉啦,我就给你意思意思,指一个方向~ 眼馋吗?我再给你看看在严肃的论文中,实验结果是什么样吧。论文中,遮盖住了图片当中的某些部分,这个 CCGAN 就负责将这部分遮盖翻译出来。 这就是 CCGAN 的核心功能了。
在我的 mnist 数据中,我也写了一个功能去遮盖住数字的一部分,然后让 CCGAN 学习补全这一部分。学习的结果如下面动图。
怎么训练¶
就基础结构来说,其实 CCGAN 和其他 GAN 并没有太大区别,都是一个 Generator 加上一个 Discriminator, 而且这里的 Discriminator 为了让自己学的更好,用更丰富的信息辅导自己学习,它也可以像 ACGAN 那样,加上标签信息。当然,如果你的图片没有标签信息,这个部分也是可以拆掉的。 论文中的结构看起来比较吓人。我们将它再简化一下,让你比较容易看出来其中的门道。
下面这张图是我画的,简单来说,Discriminator 和 ACGAN 很像。 Generator 是一个 Encoder + Decoder 模式,也可以参考我 AutoEncoder的解释:
- 接收图片,压缩理解图片内容
- 生成图片,解压创作新图片
再具体一点,这个 Generator 拿到遮挡住的图片,从整体思考这张图到底可能是一个什么东西,然后在脑袋里YY,那个被遮挡的部分有可能长成什么样。 最后生成出来的图片就是 Generator 猜测出来的样子。
所以如果你是一路看莫烦Python的GAN教程来到这里的,那么 CCGAN 用代码写出来并不是一件难事。下面我们就来写代码吧。
秀代码¶
如果想直接看全部代码, 请点击这里去往我的Github. 我在这里说一下代码当中的重点部分。
首先,训练过程 train()
我就不复述了,和前面大部分教程一模一样。Discriminator 的部分我也不复述了,和 ACGAN 的 Discriminator 极度相似,也就是除了输出一个判断真假标签外,还要同时输出判别图片的类别。下面要说最重要的 Generator 部分。
上面我构建 Generator 的时候,调用了自己写的 gan_cnn
的文件,因为后续的生成模型,有的也可以复用这一套 mnist_uni_img2img
, 所以我就封装起来,后面接着复用。在下面我给大家展开一下这个 mnist_uni_img2img
的具体内容。 整个 model 从 28*28 的 mnist 图片大小,先压缩到了 7*7 的大小,然后再解压一路又回到 28*28。 这和我们前文提到的 Encoding/Decoding 的模式是一个意思,目的是为了强迫 Generator 去压缩理解图片数据。 这一点我在 AutoEncoder 教程 中有解释。
其中有一个 InstanceNormalization()
, 他是一种替代 BatchNorm 的方式,如果你比较在乎这个怎么定义的, 你可以自己看看我的Github中的定义。 这个 InstanceNorm 还挺重要的, 我在 WGANgp 中也运用过,我先放张图,之后有机会我们再详细讲解其中的不同。
另外一个我在训练时做的小 Trick 是自动加遮盖,这么做的目的是因为我懒~我不想直接改 mnist 数据,而是每次拿到批数据去训练的时候, 帮批数据生成无重复地生成遮盖,这也有利于数据多样化,让 GAN 学习到更丰富的数据分布。所以我训练 Generator 的方法是下面这样:
生成出来的遮盖图片就如上图一样。最后一个 epoch 的生成结果也能在上面看到。很明显,没遮盖的地方已经能被想象出来了。 那么,宅男YY的生成去除马赛克的 GAN 还远吗?哇哈哈哈~
不过仔细看论文的同学会注意到,在论文中,Generator 还有一个低像素的输入信息,这个东西的确是对训练稳定性和有效性有好处的。 不过我们这个 mnist 数据因为图片尺寸本来就比较小,所以加不加这个低像素的辅助输入都无所谓,不加也还是可以学出来一个比较好的效果。 但当图片尺寸变大,比如 64*64, 那么论文中也说,加上低像素信息有助于学习。
总结¶
CCGAN 是我想提及的第一种 pic2pic 技术,也就是 看图说画
技术。后续还有很多对其改进的技术,目的都是为了,丰富原图片的信息或者生成原图片对应的其他图片, 比如变脸,上色,高清化等。从此,GAN 的应用场景变得多了很多。