训练方法
DCGAN 的训练方法跟GAN 是一样的,分为以下三步:

(1)for k steps:训练D 让式子[logD(x) + log(1 - D(G(z)) (G keeps still)]的值达到最大

(2)保持D 不变,训练G 使式子[logD(G(z))]的值达到最大

(3)重复step(1)和step(2)直到G 与D 达到纳什均衡

Alec Radford等人于2016年初提出DCGAN以改善GAN的可训练性。他们认为传统GAN之所以不稳定,一个原因便是判别器D搭载的是初级的多层感知机模型,为了将火热的CNN纳入GAN的体系中,作者将多层感知机用CNN进行替换,并做了如下改进: 
1 将池化层用stride=1的卷积层代替
2 将输给生成器G的100维噪声映射为四维张量用作CNN输入而不是向量
3 每进行一次卷积操作就进行批规一化(Batch Normalization)
4 使用ReLU层替换传统的Sigmoid函数,并对输出层使用Tanh激活
5 对判别器D使用LeakyReLU函数作为激活函数
6 移除所有全连接层
  在以上改进的支撑下,论文给出了生成器G的网络结构:

 

  经实验验证,该模型生成的图像较为稳定,虽然只能生成64*64大小的图像,但是这可以通过一些基本的图像处理方法,如金字塔来提升生成图像的分辨率。作者在卧室数据集LSUN上进行了实验,取得了较好的效果(经过一轮训练)

  

  除此之外,作者还发现DCGAN有一个算数加减性质。如下图所示,左侧为图像A,最右侧为图像B,将用于生成图像A的噪声ZA与生成B图像的噪声ZB每一维度的分量进行从ZA到ZB的线性插值,可以得到从A图像到B图像的渐变图像。利用该性质,可以生成一些原本数据集中不存在的性质的图像。这一性质有一个有趣的应用,即生成本来不存在的戴墨镜的女性。
  

转自https://blog.csdn.net/openSUSE1995/article/details/79233806

卷积与Toeplitz卷积

GAN难训练,容易出现大量无效图片的弱点仍未得到改善。为此,Alec Radford等人将卷积神经网络框架引入GAN中,替代原先的多层感知机模型,大大提升了GAN生成图片的稳定性。该论文虽没在理论上进行大量推导,但在GAN的工程实现上做出了不小的贡献。
  Toeplize矩阵与二维卷积的关系,在此基础上引出转置卷积这一升采样方法。

二维卷积与Toeplitz矩阵

二维信号的卷积可作为图像平滑去噪、提取特征(如边缘特征)的手段。其基本计算式如下:

即将卷积核B的反演信号以1为步长,在原图像A上进行滑动平均求解原图像的滤波器响应。CNN中的卷积对传统图像处理中的卷积进行了拓展,丰富了卷积操作的内涵。图像处理中的卷积原本以1为步长,且根据边缘的处理方式,分为full、same和valid三种类型。CNN中将步长(stride)为1这一限定舍去,步长可以不为1,同时,将三种不同的卷积类型用延拓的大小padding进行统一。一个图像大小为6*6,卷积核大小3*3,stride为2且padding为1的卷积实例如下图所示:

  原始卷积定义式并不适合反向求导的公式推导,为此,引入Toeplitz矩阵将卷积运算写成矩阵相乘的形式。Toeplitz矩阵是一种主对角线上的元素相等,平行于主对角线的线上的元素也相等的矩阵他可以直观地将卷积转换为矩阵乘法。为了构造Toeplitz矩阵,首先需要获得经过padding后的图像I以及卷积步长stride,在此基础上,假设可能被卷积核覆盖的区域有K个,则生成K个I的拷贝,将每个拷贝和K对应起来,即每种拷贝对应一种卷积核覆盖图像的方式,对每个拷贝中的像素值,除非该像素被卷积核覆盖,否则将其设为0,最后,将所有拷贝展成行向量并在竖向拼接成一个矩阵,再将卷积核展成列向量,二者相乘并将结果重排大小成卷积后的图像即可。一个Toeplitz的构造实例如下图所示:

  值得一提的是,如果你对MATLAB较为熟悉,就会知道一种基于im2col函数实现的更为简洁的方法。Toeplitz方法中出现了大量无效的0,这些0对于卷积运算并没有帮助,所以自然而然地,可以想到去除那些无用的0,因此,在生成拷贝时就可以将被卷积核覆盖的那部分图像取出而略过原始方案中设0的那些步骤,下图给出了一个案例可供参考。

  Toeplitz矩阵将卷积计算转化为单纯的矩阵乘法,从而使卷积过程显得更加直观,同时,它还为转置卷积提供了可行的方案。根据前文所述,容易推导出卷积前后图像的大小关系如下:

其中卷积前后图像的大小分别为I与I′,k为卷积核大小,padding与stride分别为延拓像素数目与卷积步长。

Toeplitz卷积
  二维卷积作为一种降采样的过程,可被GAN中的判别器用作提取特征的手段,值得注意的是,生成器G使用卷积这样的降采样方法显得毫无意义,为了将原始一维噪声变为图像,急需一种升采样方法,转置卷积应运而生。
  二维卷积可转换为Toeplitz矩阵与卷积核的矩阵乘法,那么能否使用Toeplitz矩阵将卷积结果还原成原始输入图像的大小?答案是肯定的,即使用Toeplitz矩阵的转置与卷积结果相乘,可以将输出恢复到原始输入图像的大小。转置卷积可以理解为是CNN反向传播求解梯度必要的一步(具体原因可参考BP算法中反向传播公式,权重梯度公式中含有δTα操作)。转置卷积具体演算过程本文不做详细介绍,可参考文献来获得一个更为直观的认识。可以推导出经过转置卷积后输入输出大小变化的公式:

其中I′为经过矩阵内补零操作后得到的新输入矩阵的大小,I是原始输入矩阵的大小,根据I+2padding−k是否为stride的整数倍,a取0或(I+2padding−k)%stride。
如果将判别器D中CNN的前向传播视为不断使用Toeplitz矩阵与输入计算矩阵乘法,并把CNN的反向传播视为反传误差与Toeplitz 矩阵的转置相乘那么生成器G的前向传播与反向传播过程就是D的反过程。
  在确定生成器G和判别器D的前传与反传算法后,就可以用深度卷积网络替代传统基于多层感知机的GAN以提升模型的学习能力。

深度学习-DCGAN论文的理解笔记的更多相关文章

  1. 深度学习-生成对抗网络GAN笔记

    生成对抗网络(GAN)由2个重要的部分构成: 生成器G(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器 判别器D(Discriminator):判断这张图像是真实的 ...

  2. Coursera深度学习(DeepLearning.ai)编程题&笔记

    因为是Jupyter Notebook的形式,所以不方便在博客中展示,具体可在我的github上查看. 第一章 Neural Network & DeepLearning week2 Logi ...

  3. 点云深度学习的3D场景理解

    转载请注明本文链接: https://www.cnblogs.com/Libo-Master/p/9759130.html PointNet: Deep Learning on Point Sets ...

  4. deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面 听课笔记

    1. 应用机器学习是高度依赖迭代尝试的,不要指望一蹴而就,必须不断调参数看结果,根据结果再继续调参数. 2. 数据集分成训练集(training set).验证集(validation/develop ...

  5. deeplearning.ai 神经网络和深度学习 week4 深层神经网络 听课笔记

    1. 计算深度神经网络的时候,尽量向量化数据,不要用for循环.唯一用for循环的地方是依次在每一层做计算. 2. 最常用的检查代码是否有错的方法是检查算法中矩阵的维度. 正向传播: 对于单个样本,第 ...

  6. 深度学习-InfoGAN论文理解笔记

    在弄清楚InfoGAN之前,可以先理解一下变分推断目的以及在概率论中的应用与ELBO是什么,以及KL散度 https://blog.csdn.net/qy20115549/article/detail ...

  7. 【计算机视觉】【神经网络与深度学习】论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection

    尊重原创,转载请注明:http://blog.csdn.net/tangwei2014 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名 ...

  8. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)

    摘要 卷积网络在特征分层领域是非常强大的视觉模型.我们证明了经过端到端.像素到像素训练的卷积网络超过语义分割中最先进的技术.我们的核心观点是建立"全卷积"网络,输入任意尺寸,经过有 ...

  9. 深度学习-语言处理特征提取 Word2Vec笔记

    Word2Vec的主要目的适用于词的特征提取,然后我们就可以用LSTM等神经网络对这些特征进行训练. 由于机器学习无法直接对文本信息进行有效的处理,机器学习只对数字,向量,多维数组敏感,所以在进行文本 ...

随机推荐

  1. cube.js 集成cratedb 的尝试

    cratedb 提供了pg协议的兼容,我们可以直接使用pg client 连接,但是也不是完整实现pg 协议的 以下是 cube.js 集成cratedb 的一些尝试 环境准备 docker-comp ...

  2. Reactive Extensions (Rx) 入门(5) —— Rx的事件编程

    译文:https://blog.csdn.net/fangxing80/article/details/7749907 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  3. Tomcat8.x的安装与启动

    Tomcat是企业网站的服务器,大多都用于中.小型网站开发和学习开发JSP应用程序中.笔者也是开始学习,下面介绍Tomcat8.x的安装步骤. 进入Tomcat官网,点击左边的download目录下的 ...

  4. 复旦高等代数I(19级)每周一题

    本学期的高等代数每周一题活动计划从第2教学周开始,到第15教学周结束,每周的周末公布一道思考题(共14道,思考题一般与下周授课内容密切相关),供大家思考和解答.每周一题将通过“高等代数官方博客”(以博 ...

  5. uni app 零基础小白到项目实战2

    <template> <scroll-view v-for="(card, index) in list" :key="index"> ...

  6. nagios监控的安装

    本文中,物理机IP 192.168.1.105虚拟linux主机ip 192.168.1.10安装apache和phpApache 和Php 不是安装nagios 所必须的,但是nagios提供了we ...

  7. 阻塞IO与非阻塞IO、同步IO与异步IO

    在学习nodejs时,了解到nodejs的一个重要特征是非阻塞IO,且nodejs中的所有IO都是异步的.既然有非阻塞IO.异步IO,那么必然就有阻塞IO.同步IO了,为了彻底搞清楚这几个概念,在网上 ...

  8. [Gamma阶段]第八次Scrum Meeting

    Scrum Meeting博客目录 [Gamma阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/06/04 大运村寝室6楼 40min ...

  9. leetcode:146. LRU缓存机制

    题目描述: 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...

  10. leetcode: 最长上升子序列

    题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 ...