Summary
该论文是上一年(2014)提出GAN之后,第一次以比较成功的姿态将GAN运用到复杂图片生成中,地位不言而喻。
DC-GAN主要提出了三种trick使得其训练更稳定,效果更好。除此之外,这篇文章还对GAN的每一个部分(生成器、鉴别器、噪声)都进行了探究,这是很难能可贵的,这些探究实验对之后GAN的可解释性以及衍生出来的应用奠定了良好的基础。
Contribution
- 提出了针对卷积生成网络的一组约束,使得GAN在大多数情况下都能够良好训练,作者将其命名为DC-GAN
- 训练好的discriminators可以当作类别分类器,作者将其与其他无监督的方法进行比较
- 可视化了feature map,证明了网络确实学到了一些语义
- 证明了对生成器某些参数进行数值上的改变可以操纵图片
Related Work
主要是一些传统的无监督学习方法
- 层次聚类
- 自编码器
- 深度信念网络
生成图片的网络,包括参数化方式和非参数化方式
- 非参数化方式主要是从图片数据库中匹配图片再进行一些操作
- 参数化方式主要是生成对抗网络在MNIST数据集上生成数字
网络可视化方面
- 激活最大化
Approach and Model Architecture
DC-GAN中采用了三个小trick来提升训练的稳定性
- 参考了全卷积神经网络,将确定性空间池化层替代为跨步的卷积,从而使得网络能够学习到其自身空间下采样
- 在卷积特征之上消除完全连接层的趋势,例如全局平均池化
- Batch Normalization,但是其可能会造成样本震荡和模型不稳定,因此在生成器的输出层和辨别器的输入层不使用BN
对于激活函数,作者在不同层使用了ReLU、Tanh和LeakyReLU。对于数据集,作者在LSUN、ImageNet-1k以及newly assembled Faces dataset中训练DC-GAN。初始化方面,均值为0标准差为0.02正态分布。batch-size为128。
值得一提的是,为了减少生成网络对数据的过拟合,作者添加了一个简单的图像重复数据删除过程,我理解的意思是去掉一些降维后的pixel,也算是一种Dropout机制。
.
以上分别为使用LSUN卧室数据集在DC-GAN训练1 epoch和5 epoch之后的效果,作者认为DC-GAN并没有记忆数据集。
评估非监督表示学习算法质量的一种常用技术是将其作为特征提取器应用于监督数据集,并评估基于这些特征的线性模型的性能。在CIFAR-10数据集上,之前K-Means和传统CNN提取特征达到了较高的精度,作者将训练好的鉴别器所有卷积层特征作为学习到的信息,加个L2-SVM进行训练,效果不如CNN,但是由于DC-GAN的鉴别器并没有接触到CIFAR-10数据(DC-GAN在ImageNet-1k上训练),所以这还体现了所学功能的领域鲁棒性。
这个实验大概就说明DC-GAN学习到了数据集的特征,并且提取到的信息能够在相似数据集上应用,体现了其鲁棒性。
VISUALIZING
第一个实验比较有趣,对于一个训练好的GAN来说,想要了解其latent-space景观,只需要按某个方向渐变噪声z,观察输出图片的变化,如果输出图片出现陡崖式剧变,说明该生成网络可能不够完善,相反的,如果其输出图片呈现出语义上的渐变,这就将会是一个有趣的现象。
作者采用的方式是在随机出的两个z中进行插值,即插入了8个中间值,结果如图所示,可见该latent space中渐变的z能够产生连续的语义。
对比一下CNN和GAN对于信息的提取异同
\space | CNN | GNN |
---|---|---|
监督方式 | 监督学习 | 无监督学习 |
信息存储形式 | 整个网络参数 | 鉴别器的参数 |
如何用于分类 | 直接可以分类 | 得加个分类器有监督训练下 |
另一个可视化实验,作者使用了基于梯度的可视化中的一种guided backpropagation,证明了分类层最后一个卷积层确实学到了一些特征。
上图是对DC-GAN中的鉴别器做的实验,同样的,生成器也可以搞点事情,生成器是如何保存学习到的知识的呢?作者做了一个实验,首先生成的完整图片中包括了小的器件,比如门、床、窗,这些小器件如何保存在生成器中?作者在150样本中手动绘制52个关于窗口的框,通过输入带窗卧室图的噪声和随机噪声,如果产生一个现象:在输入卧室图噪声时窗的框内激活为正,输入随机噪声时窗框内激活为负,则说明该feature map跟窗有关。最后通过训练二分类器删除200个跟窗有关的feature map (之后很多可解释性论文也用到了这个方法),得到如下结论图。
作者还在z上做了实验,通过人类所认为的语义图对应的z进行加减法操作,最后得到的结果居然能够符合人类的预期,这还是比较有趣的,说明生成器学到的语义也能够按照数学逻辑来操控。
这篇论文可以说是GAN在图像生成领域的开山之作。
Code
代码跟一些资料借鉴了github上大佬们的成果,其中代码部分主要借鉴了https://github.com/pytorch/tutorials/blob/master/beginner_source/dcgan_faces_tutorial.py
首先给出生成器和鉴别器的结构图
对比一下代码实现的结构
这个代码还是比较简单的,最后训练5个epoch的DC-GAN的生成器对随机出来的噪声产生的图片如下图