GAN网络从入门教程(三)之DCGAN原理
如果说最经常被用来处理图像的网络模型,那么毋庸置疑,应该是CNN了,而本次入土教程的最终目的是做一个动漫头像生成的网络模型,因此我们可以将CNN与GAN结合,也就是组成了传说中的DCGAN网络。
DCGAN简介
DCGAN全称Deep Convolutional Generative Adversarial Networks,中文名曰深度卷积对抗网络。论文地址在这里。
因为DCGAN是不仅与GAN有关还与CNN有关,因此,如果不是很了解的CNN的话,建议先去看一看CNN相关的知识,也可以参考一下我以前的博客。
这里我们可以在复述一下CNN的相关知识和特点。
CNN我们可以理解为如下的行为,逐层深入"抽丝剥茧”地“理解”一张图片或其他事物。图片经过CNN网络中的一系列layer,逐渐的对图像进行细化,最终将图像从一个大的维度变成一个小的维度。在DCGAN中,判别器实际上就是一个CNN网络。输入一张图片,然后输出yes or no的概率。

而在DCGAN中,\(G\)网络的模型是怎么样的?\(G\)网络刚好和CNN相反,它是由noise通过\(G\)网络生成一张图片,因为图片通过layer逐渐变大,与卷积作用刚好相反——因此我们可以称之为反卷积。

DCGAN的特点
当然,DCGAN除了\(G\)网络与CNN不同之外,它还有以下的不同:
- 取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
- 除了生成器模型的输出层和判别器模型的输入层,在网络其它层上都使用了Batch Normalization,使用BN可以稳定学习,有助于处理初始化不良导致的训练问题。
- G网络中使用ReLU作为激活函数,最后一层使用tanh
- D网络中使用LeakyReLU作为激活函数
几个重要概念
为了能够继续了解DCGAN,我们还是得需要准备一下几个重要概念。
下采样(subsampled)
下采样实际上就是缩小图像,主要目的是为了使得图像符合显示区域的大小,生成对应图像的缩略图。比如说在CNN中得池化层或卷积层就是下采样。不过卷积过程导致的图像变小是为了提取特征,而池化下采样是为了降低特征的维度。
上采样(upsampling)
有下采样也就必然有上采样,上采样实际上就是放大图像,指的是任何可以让图像变成更高分辨率的技术,这个时候我们也就能理解为什么在\(G\)网络中能够由噪声生成一张图片了。
它有反卷积(Deconvolution)、上池化(UnPooling)方法。这里我们只介绍反卷积,因为这是是我们需要用到的。
反卷积(Deconvolution)
反卷积(Deconvolution)也称为分数步长的卷积和转置卷积(transposed convolution)。在下图中,左边的为卷积,右边的为反卷积。convolution过程是将4×4的图像映射为2×2的图像,而反卷积过程则是将2×2的图像映射为4×4的图像,两者的kernel size均为3。不过显而易见,反卷积只能恢复图片的尺寸大小,而不能准确的恢复图片的像素值(此时我们想一想,在CNN中,卷积层的kernel我们可以学习,那么在反卷积中的kernel我们是不是也可以学习呢?)。

关于更多的我就不做更多的讲解了,大家可以参考别人的博客进行学习。

批标准化(Batch Normalization)
推荐大家去看看什么是批标准化 (Batch Normalization),通俗易懂。在下图中,我们可以看到,当\(x_2 = 20\)的时候,\(tanh(wx_2) = 0.96\),已经比较接近于1,如果继续增大\(x\),\(tanh(wx)\)也不会变化太多。也就是说此时增大\(x\),已经不对\(x\)敏感了,而这种问题即出现在输入层也出现在隐藏层。因此,我们需要将数据进行标准化(Normalization),且不仅需要在输入层进行这种操作,且在隐藏层也需要这种操作。Batch normalization 的 batch 是批数据, 把数据分成小批小批进行随机梯度下降。

BN算法如下:

当然BN算法看起来容易,实际上还是有很多复杂的东西,不过我们不做深入的探究。我们暂时只需要知道他的作用即可。
激活函数
下面是几种常用的函数的示意图:
| 激活函数 | ReLU激活函数 | tanh激活函数 | LeakyReLU激活函数 | Sigmoid函数 |
|---|---|---|---|---|
| 图像 | ![]() |
![]() |
![]() |
![]() |
G模型
下图是GCGAN的大体框架图,在生成器中,使用反卷积生成图像,在判别器中使用卷积进行判别。

下图是在Deep Convolutional Generative Adversarial Networks论文中介绍的DCGAN生成器。该网络接收一个表示为z的100x1噪声矢量,通过一系列layer,最终将noise映射到64x64x3的图像中。

上述的过程实际上就是将一个\(1 \times 100\)的向量变成$64 \times 64 \times 3 $的图片。
- Project and reshape:将\(1 \times 100\)通过骚操作变成\(4 \times 4 \times 1024\)的向量。这里我们可以使用全连接层加卷积的方法。
- CONV:反卷积
总结
以上便是DCGAN的基本原理,在下篇博客中,将基于Keras使用DCGAN来做一个动漫头像生成的东东。
训练50轮过程中的gif示意图如下:

参考
- youtube:6.4 什么是DCGAN
- 知乎:用卷积进行下采样和池化下采样的区别是什么?
- 知乎:反卷积输出尺寸计算公式
- 什么是批标准化 (Batch Normalization)
- Deep Convolutional Generative Adversarial Networks
GAN网络从入门教程(三)之DCGAN原理的更多相关文章
- GAN网络从入门教程(二)之GAN原理
在一篇博客GAN网络从入门教程(一)之GAN网络介绍中,简单的对GAN网络进行了一些介绍,介绍了其是什么,然后大概的流程是什么. 在这篇博客中,主要是介绍其数学公式,以及其算法流程.当然数学公式只是简 ...
- GAN网络从入门教程(一)之GAN网络介绍
GAN网络从入门教程(一)之GAN网络介绍 稍微的开一个新坑,同样也是入门教程(因此教程的内容不会是从入门到精通,而是从入门到入土).主要是为了完成数据挖掘的课程设计,然后就把挖掘榔头挖到了GAN网络 ...
- GAN网络之入门教程(五)之基于条件cGAN动漫头像生成
目录 Prepare 在上篇博客(AN网络之入门教程(四)之基于DCGAN动漫头像生成)中,介绍了基于DCGAN的动漫头像生成,时隔几月,序属三秋,在这篇博客中,将介绍如何使用条件GAN网络(cond ...
- GAN网络之入门教程(四)之基于DCGAN动漫头像生成
目录 使用前准备 数据集 定义参数 构建网络 构建G网络 构建D网络 构建GAN网络 关于GAN的小trick 训练 总结 参考 这一篇博客以代码为主,主要是来介绍如果使用keras构建一个DCGAN ...
- 无废话ExtJs 入门教程三[窗体:Window组件]
无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...
- PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
- Elasticsearch入门教程(三):Elasticsearch索引&映射
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
- RabbitMQ入门教程(三):Hello World
原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...
- JasperReports入门教程(三):Paramters,Fields和Detail基本组件介绍
JasperReports入门教程(三):Paramter,Field和Detail基本组件介绍 前言 前两篇博客带领大家进行了入门,做出了第一个例子.也解决了中文打印的问题.大家跟着例子也做出了de ...
随机推荐
- hadoop知识整理(5)之kafka
一.简介 来自官网介绍: 翻译:kafka,是一个分布式的流处理平台.LinkedIn公司开发.scala语言编写. 1.支持流处理的发布订阅模式,类似一个消息队列系统: 2.多备份存储,副本冗余 ...
- uni-app动态修改顶部导航栏标题
动态修改顶部导航栏标题有两种方法方式一.使用自定义到导航栏,覆盖原生导航栏 缺点:自定义到导航栏性能远远不如原生导航栏,手机顶部状态栏区域会被页面内容覆盖,这是因为窗体是沉浸式的原因,即全屏可写内容: ...
- Java8新特性之流stream
<Java 8 实战>学习笔记系列 定义 流是Java API的新成员,它允许你以声明性方式处理数据集合,可以把它看成遍历数据集的高级迭代器 示例 List<String> t ...
- java中工厂模式
最近在项目中使用了工厂模式来重构下之前的代码,在这里做个小结. 工厂模式最主要的特点是每次新增一个产品的时候,都需要新增一个新的工厂,这样在对于新的产品做扩展的时候,减少对客户端代码的修改. 我在项目 ...
- umi 调试
最近在umi. 设置一个layout字段, 结果左边菜单栏就出现了. 很神奇. 决定对这个库一探究竟. 我是一个喜欢看底层库的人,网上所有的启动方式都是yarn或者npm start 启动服务.然后 ...
- WeChair项目Alpha冲刺(6/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第六天 昨日进展: 前端:和后端成功交互,页面修改和完善 后端:和前端成功交互,但是数据解密失败,初步编写登录的service层和dao层代码未测试 ...
- Python数据可视化实战:实时更新海外疫情数据,实现数据可视化
前言 我国的疫情已经得到了科学的控制,开始了全面的复工复产,但是国外的疫情却“停不下来”.国外现在可谓就是处于水深火热当中啊,病毒极强的传染性,导致了许多的人都“中招”了,我国已经全面复工复产了,人大 ...
- SpringBoot — HelloWorld开发部署
springboot官方推荐使用jdk1.8 一.配置pom.xml 二.Application.java 三.HelloController.java 四.项目运行: Application.jav ...
- 【解读】TCP粘包拆包
一.TCP粘包.拆包图解 假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下四种情况: 1)服务端分两次读取到了两个独立的数据包,分别是D1和D2, ...
- (数据科学学习手札88)基于geopandas的空间数据分析——空间计算篇(下)
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在基于geopandas的空间数据分析系列 ...



