深度学习算法 之DCGAN(写得不系统,后期再总结,大家可简单阅览一下)

1、基本介绍
DCGAN是生成对抗网络GAN中一种常见的模型结构。其中的生成器和判别器都是神经网络模型。
GAN是一种生成式对抗网络,即通过对抗的方式,去学习数据分布的生成式模型。所谓的对抗,指的是生成网络和判别网络的互相对抗。生成网络尽可能生成逼真样本,判别网络则尽可能去判别该样本是真实样本,还是生成的假样本。

优化目标函数为:$$min_{G} max_{D} V(D,G) = min_{G} max_{D} E_{x~P_{data}(x)} [log D(x)] + E_{z~P_{z}(z)} [log(1-D(G(z)))] $$
GAN对噪声Z的分布没有特别要求,但是常用的有高斯分布、均匀分布。噪声z的维数至少要达到数据流形的内在维数,才能产生足够的diversity。
对抗网络可以认为是由一个生成模型Generator和一个判别模型Discriminator组成的,生成模型和判别模型都是使用的神经网络的算法,比如感知机、卷积神经网络等。更形象的表达是:

即通过“逆变换采样”将高斯随机变量变换成生成的概率分布。其中“逆变换采样”通过概率生成模型实现。数据分布的形象表示请看:https://blog.csdn.net/wishchin/article/details/80580923 GAN原理部分。下图为生成对抗网络的渐变图:

2、模型
DCGAN深度卷积生成对抗网络:
1、D网络模型,使用的是带步长的卷积取代池化层,进行下采样。
2、G网络模型,使用?,进行上采样。
3、激活函数为Leaky ReLu
4、使用Batch Normalization标准化DCGAN的网络结构为:

其中,G是生成模型,D是判别模型。Z是噪声,为生成模型G的输入,可以是高斯噪声,也可以是均匀噪声。
整个流程为:首先噪声数据输入到生成模型G中,生成假样本,和真实样本一起输入到判别模型D中,D会尽量地将其中的生成样本识别出来,而生成模型G会尽量使生成的样本不被识别出来,因此两者是一个博弈的过程。最终得生成样本会逐渐地贴近真实数据,从而完成了新数据的生成。
生成模型:使用卷积神经网络,除了最终输出层使用tanh,其他都使用Relu。目标是最小化判别模型D的判别准确率。
判别模型:使用卷积神经网络,都使用Leaky Relu。目标是最大化判别模型D的判别准确率。
CNN卷积神经网络:是一种专门用来处理具有类似网格结构的数据的神经网络。例如时间序列数据(在时间轴上有规律地进行采样形成的一维网格)和图像数据(二维像素网格)。单个神经元和整个神经网络结构如下图:多个输入,一个输出,第一个叫输入层,最后一个叫输出层,中间叫隐藏层。
- 输入层:众多神经元接受大量非线性输入信息,称为输入向量(x1,x2,...,xn)'。——对数据进行预处理,去均值等
- 输出层:信息在神经元连接中传输、分析、权衡,形成输出结果,输出信息称为输出向量y。——
- 隐藏层,是输入层和输出层之间众多神经元链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。——卷积计算层,激励层(ReLU),池化层(取最大)。




卷积的作用:
(1)原始图像通过与卷积核的数学运算,可以提取出图像的某些指定特征(features)。
(2)不同卷积核,提取的特征也是不一样的。
(3)提取的特征一样,不同的卷积核,效果也不一样。
- 生成模型和判别模型的实质:我们知道,机器学习的任务是从属性X预测标记Y,即求概率P(Y|X)。
对于判别模型,输入新数据X,根据P(Y|X)可以直接判别出来,实际上就是直接得到了判别边界,如下图左所示。判别式模型包括机器学习中的线性回归模型,支持向量机SVM,神经网络等。对于二分类,是指上是得到一个[0,1]之间的score,然后通过设定的阈值判定为正类还是反类。对于生成模型,输入新数据X和上一个输出Y,我们会求出他们的联合分布P(X, Y),然后通过贝叶斯公式\(P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)}\),可得\(P(X,Y) = P(Y|X)P(X)\) ,相当于求出X与不同标记之间的联合概率分布,然后联合概率大的获胜,如下图右方。生成式模型包括隐马尔科夫模型、朴素贝叶斯模型、高斯混合模型GMM、LDA等。

DCGAN使用CNN结构稳定GAN的训练,相关方式:
Batch Normalization(批处理标准化,即对每层都进行标准化):批标准化,是将分散数据统一的做法。其是优化神经网络的一种做法,因为具有统一规格的数据,能让机器学习更容易学习到数据之中的规律。
使用Transpose convlution进行上采样:转置卷积上采样,是神经网络生成图像时,从低分辨率到高分辨率的上采样方法,转置卷积能够让神经网络学会如何以最佳方式进行上采样。(最近邻插值)
使用Leaky ReLu作为激活函数:神经网络中每层网络结构输入到输出的映射,称为激活函数(一般为非线性函数)。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的pattern。Leaky ReLU = max(0.01x ,x),计算速度快,解决了梯度消失的问题,输出均值接近0。
层级结构的GAN通过逐层次、分阶段进行生成,一步步提高图像的分辨率。例如,层级结构StackGAN,阶段结构ProgressiveGAN。

自编码结构:
- 在GAN结构中,判别网络通常是一种区分真实/生成样本的概率。
- 在自编码器结构里面,判别器使用VAE作为判别器,通常被当做能量函数,AE的loss:$$D(u) = || u - AE(u) ||$$ 是一个重构误差。如果输入生成的样本,其重构误差会很大;如果输入真实样本,其重构误差会很小。
GAN的目标函数可以是最小化两个分布的JS散度,也可以是其他衡量两个分布距离,不同的距离度量方式可以得到不同的目标函数,从而改进GAN训练的稳定性。
3、优缺点/其他
- 很难取学习生成离散的数据,例如,文本。
- GAN的扩展:DCGAN,InfoGAN,AC-GAN,WGAN(GAN的改进版)
- DCGAN主要用于在图片中的生成模型。
- GAN:优化的目标函数是两个分布上的Jensen-Shannon距离,但这个距离有这样一个问题,如果两个分布的样本空间并不完全重合,这个距离是无法定义的。并且“真实分布与生成分布的样本空间并不完全重合”是一个极大概率事件。WGAN,使用Wasserstein距离代替Jensen-Shannon距离。
- GAN的应用:按文本生成图像、提高图片分辨率、
药物匹配、检索特定的模式的图片。https://www.jiqizhixin.com/articles/2017-08-23-6药物匹配:目标是训练生成器,以尽可能精确地从一个药物数据库中对现有药物进行按病取药的操作。经过训练后,可以使用生成器获得一种以前不可治愈的疾病的药方,并使用判别器确定生成的药方是否治愈了特定疾病。
参考
参考:GAN-Overview pdf文档
参考:机器学习大牛:批标准化理解 https://zhuanlan.zhihu.com/p/24810318
参考:AI研习社:Transpose convlution上采样 https://ai.yanxishe.com/page/TextTranslation/856
参考:https://zhuanlan.zhihu.com/p/25110450
参考:生成式模型和判别式模型:http://www.cnblogs.com/fanyabo/p/4067295.html
参考:https://www.zhihu.com/question/20446337
参考:《深度学习》- 《Deep Learning》
参考:CNN卷积神经网络:https://blog.csdn.net/v_JULY_v/article/details/51812459
参考:GAN原理的形象表示:https://blog.csdn.net/wishchin/article/details/80580923
参考:激活函数:https://zhuanlan.zhihu.com/p/25110450(Sigmoid函数,,tanh函数,ReLU函数,Leaky ReLU函数)
深度学习算法 之DCGAN(写得不系统,后期再总结,大家可简单阅览一下)的更多相关文章
- win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)
在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下.恰好最近换了一台笔记本,内含一块GTX1 ...
- 基于深度学习的恶意样本行为检测(含源码) ----采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类
from:http://www.freebuf.com/articles/system/182566.html 0×01 前言 目前的恶意样本检测方法可以分为两大类:静态检测和动态检测.静态检测是指并 ...
- 利用python深度学习算法来绘图
可以画画啊!可以画画啊!可以画画啊! 对,有趣的事情需要讲三遍. 事情是这样的,通过python的深度学习算法包去训练计算机模仿世界名画的风格,然后应用到另一幅画中,不多说直接上图! 这个是世界名画& ...
- 深度学习之 mnist 手写数字识别
深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...
- AI系统——机器学习和深度学习算法流程
终于考上人工智能的研究僧啦,不知道机器学习和深度学习有啥区别,感觉一切都是深度学习 挖槽,听说学长已经调了10个月的参数准备发有2000亿参数的T9开天霹雳模型,我要调参发T10准备拿个Best Pa ...
- OCR技术浅探:基于深度学习和语言模型的印刷文字OCR系统
作者: 苏剑林 系列博文: 科学空间 OCR技术浅探:1. 全文简述 OCR技术浅探:2. 背景与假设 OCR技术浅探:3. 特征提取(1) OCR技术浅探:3. 特征提取(2) OCR技术浅探:4. ...
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
我们讨论了去噪自动编码机(dA),并讨论了Theano框架实现的细节.在本节中,我们将讨论去噪自动编码机(dA)的主要应用,即组成堆叠自动编码机(SdA),我们将以MNIST手写字母识别为例,用堆叠自 ...
- Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐
本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD ...
- 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
随机推荐
- Kubernetes 配置管理 Dashboard(十三)
目录 一.安装配置 1.1 下载 镜像 1.2.安装 1.3.修改 NodePort 二.配置授权 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户 ...
- H5混合开发中android终端和ios终端常见的兼容问题1
转自 https://blog.csdn.net/xuehu837769474/article/details/80603898 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上 ...
- Legacy和UEFI,MBR和GPT的区别
Legacy(历史的,遗留的,传统的)和UEFI指的是系统引导方式(Legacy为传统BIOS,UEFI为新式BIOS),MBR和GPT指的是磁盘分区表类型. 一般情况下都是Legacy+MBR, U ...
- 源码分析之Handler
Handler是Android中的消息机制实现,可以实现UI线程和子线程的消息传递,这里就来深入了解Android的消息机制,来分析Handler的源代码 入手实例 在Android开发中,子线程与主 ...
- web自动化测试笔记(二)
如何使用selenium工具 上章节介绍了搭建web自动化的环境,这个章节介绍如何使用selenium写自动化脚本. 1.selenium selenium是一个用于web应用程序的测试工具.它可以帮 ...
- 安卓手机与iOS手机的区别
安卓手机与iOS手机的区别 1.操作系统不同 安卓手机都是安卓操作系统:IOS手机都是iOS操作系统. 目前安卓最新的系统是Android 8.1:iOS版本最新的是iOS 11. 2.操作方式不同 ...
- canal部署启动的时候报错com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set
报错信息:com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set 解决方法: 找 ...
- LVS的基础使用
LVS的基础使用 LVS的介绍 A:什么是LVS B:cluster(集群的概念) C:LVS的介绍 LVS的使用 A:ipvsadm命令的使用 ♣一:LVS的介绍 A:什么是lvs LVS的英文全称 ...
- Windows平台为 ElasticSearch 6.x 安装 Head 客户端插件
背景知识 ES 5.x 以上版本安装 head 需要 node 和 grunt 环境(之前的直接用plugin命令即可安装). 操作步骤 1. 安装 ElasticSearch 6.x,访问 http ...
- Java反射桥接方法解析
在阅读mybaits源码的反射模块时,看到了如下的一段代码: /** * 添加 Method 数组到 uniqueMethods * @param uniqueMethods * @param met ...