【CV论文阅读】生成式对抗网络GAN
生成式对抗网络GAN
1、 基本GAN
在论文《Generative Adversarial Nets》提出的GAN是最原始的框架,可以看成极大极小博弈的过程,因此称为“对抗网络”。一般包含两个部分:生成器(Generator)和判别器(Discriminator)。训练的过程是无监督学习。
先总结一下训练的过程。一般而言,输入是一个一维向量z,它从先验生成。假设现在Generator生成的是图像
。我们知道,无监督学习目的是学习数据集中的特征(或者说分布),假设真实的分布为
,而Generator的生成图像的过程其实隐式地定义了一个学习到的分布
。把生成的图像
输入到Discriminator中即
,计算的是样本来自于真实分布而不是由
生成的概率,因为Discriminator最终只有一个输出。上述无论是Generator或者Discriminator都是一般常见的网络,如下图:
如上所说,训练的过程是极大极小的博弈过程,归纳成下式:
即Generator希望极大化Discriminator误判的概率,而Discriminator极小化把生成样本判成来自真实data的概率。论文中证明,上式的最优解在于。
可以看到,学习到的样本分布(或者特征表示)并没有一个显式的结果,这算是GAN的一个缺点了。训练的过程是同时训练两个网络,由于Discriminator可以更好地指导Generator的调整,所以一般会让Discriminator循环的次数更多。最优化过程使用的是梯度下降算法,如下:
疑惑:在训练D的时候,按照公式应该是一个极大化的过程,为什么可以使用SGD呢?因此我觉得上式应该是不对的,之前应该缺少一个负号转换成一个极小化的问题。
而开始时,可能会很接近于0,这使得log函数也接近于0,最终结果是梯度下降时由于回流梯度过小无法更新浅层网络。因此,论文建议训练开始时可以求解极大化
。
2、深度卷积生成对抗网络DCGAN
论文《UNSUPERVISED REPRESENTATION L EARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS》提出DCGAN,可以看成是GAN应用在CNN的尝试。论文更多的是在CNN工程上的尝试经验,由于GAN在训练时的不稳定性,因此提出了几点改变:
1、把所有的pooling层用strided convolution替代。在D网络即是跨步长的卷积,在G网络则是上采样(此处称为fractional-strided,但很多代码实现似乎都用了deconv,在tensorflow有这样一个函数)。
2、在G和D都应用BN,但是在G的输出层和D的输入层不应用BN。
3、移除全连接层
4、在G中的激活函数使用RELU,但在输出层使用的是Tanh
5、在D中的激活函数全部使用Leaky ReLu。
结构图如下:
这里主要看它的实现过程。代码来自https://github.com/carpedm20/DCGAN-tensorflow/blob/master/model.py 。
D网络部分和一般的卷积网络没有什么区别,主要最后一步是把feature map进行一个flatten的操作,然后全部feed到一个sigmoid的单元,即下式的h4。
h0 = lrelu(conv2d(image, self.df_dim, name='d_h0_conv'))
h1 = lrelu(self.d_bn1(conv2d(h0, self.df_dim*2, name='d_h1_conv')))
h2 = lrelu(self.d_bn2(conv2d(h1, self.df_dim*4, name='d_h2_conv')))
h3 = lrelu(self.d_bn3(conv2d(h2, self.df_dim*8, name='d_h3_conv')))
h4 = linear(tf.reshape(h3, [self.batch_size, -1]), 1, 'd_h3_lin')
return tf.nn.sigmoid(h4), h4
注意这里的conv2d实现时已经加上了bias。
在G网络部分,主要关注z到project and reshape部分和如何进行fractional-strided convolution。
对于project and reshape,代码中的实现是:
self.z_, self.h0_w, self.h0_b = linear(z, self.gf_dim*8*s16*s16, 'g_h0_lin', with_w=True)
self.h0 = tf.reshape(self.z_, [-1, s16, s16, self.gf_dim * 8])
其中linear()函数是通过matrix相乘把z变成self.gf_dim*8*s16*s16
大小的向量。然后通过
reshape
得到
feature maps
。
而对于
fractional-strided convolution,这里使用一个函数deconv2d(),代码如下:
w = tf.get_variable('w', [k_h, k_w, output_shape[-1], input_.get_shape()[-1]],initializer=tf.random_normal_initializer(stddev=stddev))
deconv = tf.nn.conv2d_transpose(input_, w, output_shape=output_shape, strides=[1, d_h, d_w, 1])
biases = tf.get_variable('biases', [output_shape[-1]], initializer=tf.constant_initializer(0.0))
deconv = tf.reshape(tf.nn.bias_add(deconv, biases), deconv.get_shape())
通过一个tf.nn.conv2d_transpose()函数实现反卷积。但有一点注意的是,tf.nn.conv2d_transpose()函数不是什么shape都可以输出的,验证是否正确的方法是,把output与卷积核w做一次卷积,如果得到的shape和input的一致,代表是正确的。
可以参考http://stackoverflow.com/questions/35488717/confused-about-conv2d-transpose 。
3、条件GAN conditional GAN
条件GAN,我认为很多blog是写错了的,它和条件概率应该是没有关系的。GAN的一个很大的优点是,它的输入很灵活没有过大的限制。而条件GAN其实是在一般输入时添加了额外的input,这作为一个可控制的变量去指导着网络的训练。因为基本GAN的训练应该是无方向(这里表达不准确)的。
一个简单的网络如下:
Y作为额外的输入的变量,是可控的。在论文《Conditional Generative Adversarial Nets》中的一个例子是训练mnist,其中y则是0~9的标签的一个one-hot的编码向量。
此外,由于GAN输入的灵活,可以很容易想到可以加入多模态的信息对网络训练进行指导,事实上已经有了不少的尝试。
【CV论文阅读】生成式对抗网络GAN的更多相关文章
- 生成式对抗网络GAN 的研究进展与展望
生成式对抗网络GAN的研究进展与展望.pdf 摘要: 生成式对抗网络GAN (Generative adversarial networks) 目前已经成为人工智能学界一个热门的研究方向. GAN的基 ...
- 【神经网络与深度学习】生成式对抗网络GAN研究进展(五)——Deep Convolutional Generative Adversarial Nerworks,DCGAN
[前言] 本文首先介绍生成式模型,然后着重梳理生成式模型(Generative Models)中生成对抗网络(Generative Adversarial Network)的研究与发展.作者 ...
- 生成式对抗网络(GAN)实战——书法字体生成练习赛
https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...
- Keras入门——(3)生成式对抗网络GAN
导入 matplotlib 模块: import matplotlib 查看自己版本所支持的backends: print(matplotlib.rcsetup.all_backends) 返回信息: ...
- 不要怂,就是GAN (生成式对抗网络) (一)
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- 不要怂,就是GAN (生成式对抗网络) (一): GAN 简介
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- GAN生成式对抗网络(四)——SRGAN超高分辨率图片重构
论文pdf 地址:https://arxiv.org/pdf/1609.04802v1.pdf 我的实际效果 清晰度距离我的期待有距离. 颜色上面存在差距. 解决想法 增加一个颜色判别器.将颜色值反馈 ...
- 生成式对抗网络(GAN)学习笔记
图像识别和自然语言处理是目前应用极为广泛的AI技术,这些技术不管是速度还是准确度都已经达到了相当的高度,具体应用例如智能手机的人脸解锁.内置的语音助手.这些技术的实现和发展都离不开神经网络,可是传统的 ...
- AI 生成式对抗网络(GAN)
生成式对抗网络(Generative Adversarial Network,简称GAN),主要由两部分构成:生成模型G和判别模型D.训练GAN就是两种模型的对抗过程. 生成模型:利用任意噪音(ran ...
随机推荐
- OC 实现一个TODO宏
实现一个TODO宏 转载http://blog.sunnyxx.com/2015/03/01/todo-macro/ 实现一个能产生warning的TODO宏,用于在代码里做备忘,效果: 下面一步步来 ...
- PHP serialize() 序列化函数
PHP serialize() 序列化函数 定义和用法 — 语法 string serialize ( mixed $value ) serialize() 返回字符串,此字符串包含了表示 value ...
- Sublime Text 2/3 输入法修复[Ubuntu(Debian)]
一直想找一个可以替代sublime的IDE主要还是hi因为没有好的方法解决中文输入的问题, 今天在网上找到一个非常不错的方法,亲自实验是可行的,就记录下来了,我的系统是ubuntu16.04 Subl ...
- matlab中数据类型
在MATLAB中有15种基本数据类型,分别是8种整型数据.单精度浮点型.双精度浮点型.逻辑型.字符串型.单元数组.结构体类型和函数句柄.这15种基本数据类型具体如下. 有符号整数型:int8,int1 ...
- python3爬取微博评论并存为xlsx
python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...
- MySQL性能优化之max_connections配置
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量.如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于M ...
- python常见问题一(安装报错)
常见问题一:我在安装python2.7时,提示错误:'An error occurred during the installation of assembly 'Microsoft.VC90.CRT ...
- 谈谈JVM垃圾回收机制及垃圾回收算法
一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制 ...
- Java A
4.在ORACLE大数据量下的分页解决方法.一般用截取ID方法,还有是三层嵌套方法. 答:一种分页方法 <% int i=1; int numPages=14; String pages = r ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...