https://www.toutiao.com/a6666031263536644621/

自从Ian Goodfellow的论文以来,GAN已应用于许多领域,但其不稳定性一直存在问题。GAN必须解决极小极大(鞍点)问题,因此这个问题是固有的。

马鞍点的滑稽表示

许多研究人员试图通过各种方法解决GAN的这些困境。其中DCGAN已经取得了显著的成果。DCGAN提出了稳定的GAN网络结构。如果您根据本文的指导设计模型,可以看出模型训练是稳定的。

稳定的深度卷积GANs的体系结构指南

•用 strided convolutions(判别器)和 fractional-strided convolutions (生成器)替换任何池化层 。

• 在生成器和判别器中使用 batchnorm

• 删除完全连接的隐藏层以获得更深层次的架构。

• 除了使用Tanh之外, 对生成器中的所有层使用ReLU激活 。

• 在判别器中对所有层使用LeakyReLU激活 

生成器

DCGAN生成器的结构

首先,生成器项目和重塑噪声分布(100-dim阵列)到4x4x1024特征映射。我们使用matmulreshape函数来实现它。然后,我们使用一系列四个fractionally-strided函数卷积(conv2d_transpose)来逐步创建64x64图像。如上所述,batchnorm放置在每层的末尾,并且除输出之外,relu作为激活函数。我们使用tanh作为输出,所以输出的像素范围是[-1,1]。

def generator(self, input, reuse = False):with tf.variable_scope("generator") as scope:if reuse:scope.reuse_variables()G_FW1 = tf.get_variable('G_FW1', [self.n_noise, self.n_hidden], initializer = tf.random_normal_initializer(stddev=0.01))G_Fb1 = tf.get_variable('G_Fb1', [self.n_hidden], initializer = tf.constant_initializer(0))G_W1 = tf.get_variable('G_W1', [5,5,self.n_W2, self.n_W1], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W2 = tf.get_variable('G_W2', [5,5,self.n_W3, self.n_W2], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W3 = tf.get_variable('G_W3', [5,5,self.n_W4, self.n_W3], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W4 = tf.get_variable('G_W4', [5,5,self.image_channels, self.n_W4], initializer = tf.truncated_normal_initializer(stddev=0.02))hidden = tf.nn.relu(tf.matmul(input, G_FW1) + G_Fb1)hidden = tf.reshape(hidden, [self.batch_size, 4,4,self.n_W1]) dconv1 = tf.nn.conv2d_transpose(hidden, G_W1, [self.batch_size, 8, 8, self.n_W2], [1, 2, 2, 1])dconv1 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv1,decay=0.9, epsilon=1e-5))dconv2 = tf.nn.conv2d_transpose(dconv1, G_W2, [self.batch_size, 16, 16, self.n_W3], [1, 2, 2, 1])dconv2 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv2,decay=0.9, epsilon=1e-5))dconv3 = tf.nn.conv2d_transpose(dconv2, G_W3, [self.batch_size, 32, 32, self.n_W4], [1, 2, 2, 1])dconv3 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv3,decay=0.9, epsilon=1e-5))dconv4 = tf.nn.conv2d_transpose(dconv3, G_W4, [self.batch_size, 64, 64, self.image_channels], [1, 2, 2, 1])#dconv4 = tf.nn.relu(tf.layers.batch_normalization(dconv3, training = 'True'))output = tf.nn.tanh(dconv4)return output

判别器

本文中使用的判别器与生成器具有对称结构。与生成器相反,它通过减小图像大小来训练特征映像。所以我们使用了步幅大小为2的conv2d。与生成器相同,batchnorm放置在每层的末尾。但是leaky relu被用作激活函数。

 def discriminator(self, input, reuse = False):with tf.variable_scope("discriminator") as scope:if reuse:scope.reuse_variables()D_W1 = tf.get_variable('D_W1', [5,5,self.image_channels, self.n_W5], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W2 = tf.get_variable('D_W2', [5,5,self.n_W5, self.n_W4], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W3 = tf.get_variable('D_W3', [5,5,self.n_W4, self.n_W3], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W4 = tf.get_variable('D_W4', [5,5,self.n_W3, self.n_W2], initializer = tf.truncated_normal_initializer(stddev=0.02)) D_FW1 = tf.get_variable('D_FW1', [4*4*self.n_W2, 1], initializer = tf.random_normal_initializer(stddev=0.01))D_Fb1 = tf.get_variable('D_Fb1', [1], initializer = tf.constant_initializer(0))conv1 = tf.nn.conv2d(input, D_W1, strides = [1, 2, 2, 1], padding='SAME')conv1 = tf.nn.leaky_relu(conv1, alpha = 0.2)conv2 = tf.nn.conv2d(conv1, D_W2, strides = [1, 2, 2, 1], padding='SAME')conv2 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv2, decay=0.9, epsilon=1e-5), alpha = 0.2)conv3 = tf.nn.conv2d(conv2, D_W3, strides = [1, 2, 2, 1], padding='SAME')conv3 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv3, decay=0.9, epsilon=1e-5), alpha = 0.2)conv4 = tf.nn.conv2d(conv3, D_W4, strides = [1, 2, 2, 1], padding='SAME')conv4 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv4, decay=0.9, epsilon=1e-5), alpha = 0.2)hidden = tf.reshape(conv4, [self.batch_size, 4*4*self.n_W2]) output = tf.nn.sigmoid(tf.matmul(hidden, D_FW1) + D_Fb1)return output

损失函数和优化器

损失函数和优化器与基本GAN相同。然而,根据该DCGAN论文的(对抗性训练的细节)中,我们设置优化器的学习率0.0002bata1为0.5

def loss(self, X, Z):g_out = self.generator(Z)d_fake = self.discriminator(g_out, reuse = False)d_real = self.discriminator(X, reuse = True)d_loss = tf.reduce_mean(tf.log(d_real) + tf.log(1 - d_fake))g_loss = tf.reduce_mean(tf.log(d_fake))return d_loss, g_lossdef optimizer(self, d_loss, g_loss, learning_rate):d_var_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='discriminator')g_var_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='generator')#print('G_var_list:', len(G_var_list))#print('D_var_list:', len(D_var_list))d_opt = tf.train.AdamOptimizer(learning_rate, beta1 = 0.5).minimize(-d_loss,var_list=d_var_list)g_opt = tf.train.AdamOptimizer(learning_rate, beta1 = 0.5).minimize(-g_loss,var_list=g_var_list)return d_opt, g_opt

结果

数据集是从kaggle下载的。数据集下载地址(https://www.kaggle.com/scolianni/mnistasjpg)

DCGAN

BasicGAN

使用mnist数据集训练了DCGAN和basicGAN模型。DCGAN生成比basicGAN更干净的图像。当然,上述结果似乎是合理的,因为DCGAN具有比BasicGAN更复杂的结构并且具有更多参数。但是DCGAN中引入的方法甚至可以稳定地学习复杂的模型。这是DCGAN的贡献。

此外,我还使用Celeb_A数据集训练了两个模型,其中有大约200k肖像照片。数据集下载地址(https://www.kaggle.com/jessicali9530/celeba-dataset)

DCGAN

BasicGAN

我们为DCGAN和BasicGAN模型训练了9个周期。DCGAN不仅可以产生清晰的图像,还可以表现出各种特征,如眼镜,妆容和胡须。但它仍然看起来不自然。

这就是利用深度学习来实现人脸的创造。其他深度学习模型(如变分自编码器自回归模型)也是生成模型的好示例。

机器学习中的DCGAN-Tensorflow:用于更稳定的训练相关推荐

  1. 关于Tensorflow用于深度神经网络训练中的一些问题

    小弟刚接触tensorflow,之前在一篇文章中看到一个用于DNN神经网络预测,想尝试对该代码进行一点修改.原文:https://blog.csdn.net/xxzhangx/article/deta ...

  2. 机器学习中对数据集进行拆分及模型训练

    对数据集的处理 经过预处理后得到: 特征集X 目标集Y 将特征集拆分: 一般来说机器学习的数据集都会被划分成三个个子集:训练集,验证集和测试集: 我们拿到的数据集通常都是由人工或者半自动化的方式收集来 ...

  3. 机器学习中,有监督与无监督训练的区别与联系

    简单来说,是否有监督,就看输入是否有标签(label).监督学习即通过已有的训练样本来训练,从而得到一个最优模型,再利用这个模型将数据样本映射为相应的结果.例如:分类,回归各种算法,SVM, KNN, ...

  4. 机器学习中学习库sklearn跟TensorFlow的区别

    1.功能不同 Scikit-learn(sklearn)的定位是通用机器学习库,而TensorFlow(tf)的定位主要是深度学习库.一个显而易见的不同:tf并未提供sklearn那种强大的特征工程, ...

  5. 量子计算 qiskit_将Tensorflow和Qiskit集成到量子机器学习中

    量子计算 qiskit 总览 (Overview) There exist two popular integrations of quantum computing packages in stan ...

  6. 使用tensorflow实现机器学习中的线性拟合

    使用tensorflow实现机器学习中的线性拟合 这个例子是模拟的单变量线性回归,通过提高单变量的阶数来增加特征数量,例如:4阶相当于分解为四个特征 这种思想同样适用于多变量线性回归 import t ...

  7. ​机器学习中必要的数学基础!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Benjamin Obi Tayo 来源:机器之心 作为一门基础性 ...

  8. 10个例子带你了解机器学习中的线性代数

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:机器之心 本文介绍了 10 个常见机器学习案例,这些案例需要 ...

  9. 免费教材丨第55期:Python机器学习实践指南、Tensorflow 实战Google深度学习框架

    小编说  时间过的好快啊,小伙伴们是不是都快进入寒假啦?但是学习可不要落下哦!  本期教材  本期为大家发放的教材为:<Python机器学习实践指南>.<Tensorflow 实战G ...

最新文章

  1. Axel之 -axel_do剖析
  2. 面试季,Java中的static关键字解析
  3. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
  4. yum 代理_教你如何在5分钟轻松部署nginx反向代理
  5. mysql 临时表 heap_MySQL内存表-临时表
  6. ie 不执行回调函时_javascript引擎执行的过程的理解--执行阶段
  7. Spring-AOP实现的两种方式
  8. 轻松为Windows系统快速配置多个网关
  9. Git 使用,命令说明
  10. 挤拥城市游戏android,拥挤城市crowdcity
  11. [转]把人当成一个公司来经营,心就不会那么累
  12. Java标签分页实现
  13. 10年产品人总结了9条血泪教训
  14. Java设计模式(10)代理模式(Proxy模式)
  15. 第二季-专题4-我是bootloader设计师
  16. STM32程序烧录方式总结
  17. VeiwPager、Gallery、ViewFlipper区别
  18. 二分法查找(dichotomy)--python实现
  19. 深度学习常用python库学习笔记
  20. 常见PCIE X1/X4/X8/X16插槽作用与区别

热门文章

  1. (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?
  2. 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应
  3. java 中对多态的理解
  4. 这几本高分算法书助你稳步提升
  5. 这几本豆瓣高分设计好书,人人都应该读!
  6. 不能跳过的《程序员的职业素养》(The Clean Coder)中的一个章节
  7. 通知 | “大数据能力提升项目”证书办理及领取(2021年秋季学期)
  8. 疫情过后人工智能是否能迎来春天?
  9. 《大数据实践课》开创实践教学新模式:清华大数据能力提升项目特色课程系列报道之一
  10. 图灵奖得主吐槽中国高校「重科研,轻教育」怪象!高校教师评价体系是元凶?...