论文阅读之 Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks

1. Introduction

这篇论文主要有以下几个方面的贡献:

  • 作者对卷积GAN的拓扑结构提出并评估了一系列的限制, 使得卷积GAN在大部分的设置下能够稳定的训练. 作者把这种结构称作 Deep Convolutional GANs(DCGAN)
  • 作者将训练好的的判别器用于图像识别任务, 展示了与其他非监督算法的有竞争性的表现
  • 他们对GAN学习到的filter进行了可视化, 实验表明特定的filter学习到了去生成特定的物体
  • 我们展示了生成器具有有趣的矢量算术属性,使得能够允许容易地操纵生成的样本的语义性质。

3. Approach and model architecture

相较于原始的GAN, 作者主要做了以下几个改变:

  • 用步长卷积(判别器)和反卷积(生成器)代替池化层.
  • 在生成器和判别器中都使用batch normal.
  • 移除全连接层.
  • 生成器的所有层都是使用ReLU**函数, 除了输出层使用Tanh**函数.
  • 判别器的所有层都使用LeakyReLU**函数.

论文中的所用的网络结构如下:
论文阅读——《Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks》
判别器的网络结构与此对称. 代码如下, 结构略有不同, 最终生成的是32 * 32 * 3 的图片, 仅供参考:

def generator(z, reuse=False, training=True):
   with tf.variable_scope('generator', reuse=reuse):
       # 1 * 1 * 100 -> 4 * 4 * 512
       h0 = tf.layers.conv2d_transpose(z, 512, [4, 4], strides=(1, 1), padding='valid', name='g_h0_dconv')
       h0 = leaky_relu(tf.layers.batch_normalization(h0, training=training, name='g_h0_bn'))

       # 4 * 4 * 512 -> 8 * 8 * 256
       h1 = tf.layers.conv2d_transpose(h0, 256, [4, 4], strides=(2, 2), padding='same', name='g_h1_dconv')
       h1 = leaky_relu(tf.layers.batch_normalization(h1, training=training, name='g_h1_bn'))

       # 8 * 8 * 256 -> 16 * 16 * 128
       h2 = tf.layers.conv2d_transpose(h1, 128, [4, 4], strides=(2, 2), padding='same', name='g_h2_dconv')
       h2 = leaky_relu(tf.layers.batch_normalization(h2, training=training, name='g_h2_bn'))

       # 16 * 16 * 128 -> 32 * 32 * 3
       h3 = tf.layers.conv2d_transpose(h2, 3, [4, 4], strides=(2, 2), padding='same', name='g_h3_dconv')
       h3 = tf.nn.tanh(h3)

       return h3


def discriminator(images, reuse=False, training=True):
   with tf.variable_scope('discriminator', reuse=reuse):
       # 32 * 32 * 3 -> 16 * 16 * 128
       h0 = tf.layers.conv2d(images, 128, [4, 4], strides=(2, 2), padding='same', name='d_h0_conv')
       h0 = leaky_relu(tf.layers.batch_normalization(h0, training=training, name='d_h0_bn'))

       # 16 * 16 * 128 -> 8 * 8 * 256
       h1 = tf.layers.conv2d(h0, 256, [4, 4], strides=(2, 2), padding='same', name='d_h1_conv')
       h1 = leaky_relu(tf.layers.batch_normalization(h1, training=training, name='d_h1_bn'))

       # 8 * 8 * 256 -> 4 * 4 * 512
       h2 = tf.layers.conv2d(h1, 512, [4, 4], strides=(2, 2), padding='same', name='d_h2_conv')
       h2 = leaky_relu(tf.layers.batch_normalization(h2, training=training, name='d_h2_bn'))

       # 4 * 4 * 512 -> 1 * 1 * 1
       h3 = tf.layers.conv2d(h2, 1, [4, 4], strides=(1, 1), padding='valid', name='d_h3_conv')

       return tf.nn.sigmoid(h3), h3

5. Empirical Validation of DCGANS Capabilities

在这个部分作者将训练好的判别器用作特征提取器, 并将其应用于有监督的数据集来评估使用这些特征的线性模型的表现.

为了使用判别器学习到的特征, 作者使用了判别器所有层的特征. 作者将每一层做了最大池化生成了4 * 4的空间网格. 然后再将这些特征压平, 连接成了一个28672维的向量. 然后再在这些特征上面训练一个线性的L2-SVM分类器, 数据集使用的是Imagenet-1k. 作者在论文中比较了 DCGAN+L2-SVM 与其他无监督学习算法在CIFAR-10和SVHN数据集上的表现.
论文阅读——《Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks》
论文阅读——《Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks》

6. Investigating And Visualization The Internals of The Network

作者对训练好的生成器和判别器做了各种研究. 包括DCGAN的可视化, 操作生成器表征, 对生成向量z的算数特征的研究等.

相关文章: