DCGAN,全称是Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络),是Alec Radfor等人于2015年提出的一种模型。该模型在Original GAN的理论基础上,开创性地将 CNN 和 GAN 相结合以实现对图像的处理,并提出了 一系列的对网络结构的限制,以提高网络的稳定性。(DCGAN的网络结构在之后的各种改进GAN中得到了沿用,可以说是当今各类改进GAN的前身。)
【文章链接】:
https://arxiv.org/abs/1511.06434
【参考代码-TensorFlow】:
https://github.com/carpedm20/DCGAN-tensorflow
【参考解读】:
原理:
[1] DCGAN 论文翻译
[2] GANs学习系列(9):DCGAN对抗卷积神经网络总结
代码解读:
[1] DCGAN 代码简单解读
[2] DCGAN论文及代码学习
[3] DCGAN生成二次元美少女头像
作者经过反复实验和尝试之后,提出了一系列的架构,可以让GAN + CNN更加稳定,可以 deeper,并且产生更高分辨率的图像。
DCGAN的核心工作是对现有的CNN架构做了如下几个方面的修改:
全卷积网络(all convolutional net):用步幅卷积(strided convolutions)替代确定性空间池化函数(deterministic spatial pooling functions)(比如最大池化),让网络自己学习downsampling方式。作者对 generator 和 discriminator 都采用了这种方法。
取消全连接层: 比如,使用 全局平均池化(global average pooling)替代 fully connected layer。global average pooling会降低收敛速度,但是可以提高模型的稳定性。GAN的输入采用均匀分布初始化,可能会使用全连接层(矩阵相乘),然后得到的结果可以reshape成一个4 dimension的tensor,然后后面堆叠卷积层即可;对于鉴别器,最后的卷积层可以先flatten,然后送入一个sigmoid分类器。
批量归一化(Batch Normalization): 即将每一层的输入变换到0均值和单位方差(注:其实还需要shift 和 scale),BN 被证明是深度学习中非常重要的 加速收敛 和 减缓过拟合 的手段。这样有助于解决 poor initialization 问题并帮助梯度流向更深的网络。防止G把所有rand input都折叠到一个点。但是实践表明,将所有层都进行Batch Normalization,会导致样本震荡和模型不稳定,因此 只对生成器(G)的输出层和鉴别器(D)的输入层使用BN。
(Leaky)Relu Activation 激活函数: 生成器(G),输出层使用tanh 激活函数,其余层使用relu 激活函数。鉴别器(D),都采用leaky rectified activation。
DCGAN生成器G的结构如下图所示:
从随机向量z到4×4×1024的数据体的映射变换容易让人困惑,可以结合具体代码来理解具体操作。
def generator(self, z, y=None):
with tf.variable_scope("generator") as scope:
if not self.y_dim:
s_h, s_w = self.output_height, self.output_width
s_h2, s_w2 = conv_out_size_same(s_h, 2), conv_out_size_same(s_w, 2)
s_h4, s_w4 = conv_out_size_same(s_h2, 2), conv_out_size_same(s_w2, 2)
s_h8, s_w8 = conv_out_size_same(s_h4, 2), conv_out_size_same(s_w4, 2)
s_h16, s_w16 = conv_out_size_same(s_h8, 2), conv_out_size_same(s_w8, 2)
# project `z` and reshape
self.z_, self.h0_w, self.h0_b = linear(
z, self.gf_dim*8*s_h16*s_w16, 'g_h0_lin', with_w=True)
self.h0 = tf.reshape(
self.z_, [-1, s_h16, s_w16, self.gf_dim * 8])
h0 = tf.nn.relu(self.g_bn0(self.h0))
CNN在supervised learning 领域取得了非常了不起的成就(比如大规模的图片分类,目标检测等等),但是在unsupervised learning领域却没有特别大的进展。所以作者想弥补CNN在supervised 和 unsupervised之间的隔阂(gap)。作者提出了 将CNN和GAN相结合 的DCGAN,并展示了它在unsupervised learning所取得的不俗的成绩。作者通过在大量不同的image datasets上的训练,充分展示了DCGAN的generator(生成器)和discriminator(鉴别器)不论是在物体的组成部分(parts of object)还是场景方面(scenes)都学习到了丰富的层次表达(hierarchy representations)。作者还将学习到的特征应用于新的任务上(比如image classification),结果表明这些特征是非常好的通用图片表达(具有非常好的泛化能力)。
这篇文章在以下几个方面做出了贡献:
文章主要在LSUN数据集,ImageNet 1k以及一个较新的celebA数据集上进行了实验。训练的一些细节如下:
overfitting。当生成模型产生的图片质量越来越好的时候,我们就需要考虑overfitting的问题了,即generator有可能只是简单记住训练样本,然后产生类似的输出结果。为了展示DCGAN如何扩展到更大的数据集以及产生更高质量的图片,我们在包含300万训练样本的celebA bedroom datasets 上进行了训练。作者展示了每一轮训练之后采样的结果,表明模型产生的高质量输出不是简单通过记住训练样本而得到的。
去重(deduplication)
为了防止模型过拟合,即模型简单记住输入的特征,然后生成类似的图片。作者还对训练样本进行了去重处理,即去除相似度较高的图片。具体的原理可以参考论文。
原始的celebA数据集是从互联网网页上抓取的现代人的人脸数据集。大约包含300张约10000个人的人脸数据。文中对这些数据使用opencv的face detector进行人脸检测,保证得到具有一定高精度的人脸bounding box,最后得到大约35w个face bounding box,然后使用这些face bounding box 进行训练。没有使用data augmentation。
对imagenet-1k的图片使用32x32的min-resized-center-crops进行训练。同样没有进行data augmentation。
待补充