gan

GAN原理解析,公式推导与python实现

我们两清 提交于 2019-12-05 10:49:09
1-生成模型 1-1 生成模型与判别模型 1-2 为什么学习生成模型 1-3 生成模型原理似然原理 2-生成式对抗网络 2-1 生成式对抗网络工作原理 2-2 判别器的损失函数 2-3 生成器损失定义1minimax 2-4 生成器损失定义2Non-Saturating Game 2-5 第三种策略极大似然估计 2-5-1 KL 散度的定义 2-5-2 KL散度的推导 2-5-3 利用KL散度度量生成分布与真实分布的相似性 3-GAN实现 1-生成模型 1-1 生成模型与判别模型 生成式对抗网络,顾名思义就是生成模型嘛!那什么是生成模型呢?与判别模型有什么区别呢? 先来理解一下判别模型。 学过机器学习的人都知道,入门级的算法逻辑回归,最后的预测,是通过sigmoid函数: 生成一个0-1之间的数值,然后用某一阀值来做分类,我们称之为判别模型: 由数据直接学习,通过决策函数 Y = f ( X ) //--> 或者概率模型 P ( Y | X ) //--> 预测,判断类别的模型。 逻辑回归中的sigmoid函数就是判别函数。 而生成模型,则先学习出一个 联合概率密度分布 P ( X , Y ) //--> ,最后分类,预测的时候,使用条件概率公式 P ( Y | X ) = P ( X , Y ) P ( X ) //--> 来预测当前样本属于每一类的概率。 生成模型的核心

[转载]--令人拍案叫绝的Wasserstein GAN

我只是一个虾纸丫 提交于 2019-12-05 10:46:05
文章转载自: https://zhuanlan.zhihu.com/p/25071913 令人拍案叫绝的Wasserstein GAN 郑华滨 · 2 天前 在GAN的相关研究如火如荼甚至可以说是泛滥的今天,一篇新鲜出炉的arXiv论文《 Wassertein GAN 》却在Reddit的Machine Learning频道火了,连Goodfellow都 在帖子里和大家热烈讨论 ,这篇论文究竟有什么了不得的地方呢? 要知道自从 2014年Ian Goodfellow提出 以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进 DCGAN 依靠的是对判别器和生成器的架构进行实验枚举,最终找到一组比较好的网络架构设置,但是实际上是治标不治本,没有彻底解决问题。而今天的主角Wasserstein GAN(下面简称WGAN)成功地做到了以下爆炸性的几点: 彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度 基本解决了collapse mode的问题,确保了生成样本的多样性 训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高(如题图所示) 以上一切好处不需要精心设计的网络架构

用各种GAN生成MNIST数字

北战南征 提交于 2019-12-05 10:45:52
用各种GAN生成MNIST数字 完整代码 : https://github.com/SongDark/GAN_collections 数据获取 MNIST数据集的获取可以参考这篇博客: https://blog.csdn.net/songbinxu/article/details/82992264 需要注意的是MNIST数据的值域范围,有的源是原本的 [ 0 , 255 ] [0,255] [ 0 , 2 5 5 ] ,有的归一化到了 [ 0 , 1 ] [0,1] [ 0 , 1 ] 。 生成器和判别器 实现了CNN和MLP两种版本。CNN结构参考自 这里 ,MLP结构参考自 这里 。 有关 Spectral Norm 在 dense 层、 conv2d 层和 deconv2d 层中都实现了 Spectral Normalization ,可以自由选择或取消。 Spectral Normalization 是用来限制判别器D的,不应该加到生成器G中。 有关 Gradient Clipping 所谓 Gradient Clipping(GC) 就是将参数限制在某个范围内,比如 ( − 0.01 , 0.01 ) (-0.01,0.01) ( − 0 . 0 1 , 0 . 0 1 ) ,它也是用来限制判别器D的,不应该加到生成器G中。WGAN的原始版本必须加GC

tensorflow学习(7. GAN实现MNIST分类)

走远了吗. 提交于 2019-12-05 10:45:32
https://blog.csdn.net/CoderPai/article/details/70598403?utm_source=blogxgwz0 里面有比较全面的GAN的链接 原始论文链接: http://papers.nips.cc/paper/5423-generative-adversarial-nets.pdf 一篇不错的理解GAN的文章: https://blog.csdn.net/qq_31531635/article/details/70670271 这篇GAN代码的出处 https://wiseodd.github.io/techblog/2016/09/17/gan-tensorflow/ 简单用了别人的代码,实现了一下,加入了自己理解的部分: import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import os from tensorflow.examples.tutorials.mnist import input_data sess = tf.InteractiveSession() mb_size = 128 Z_dim = 100 mnist = input_data

GAN——WGAN

筅森魡賤 提交于 2019-12-05 10:45:05
Wasserstein GAN,作者Ajvosky。 知乎上郑华滨 的 令人拍案叫绝的Wasserstein GAN 讲的简洁明白。 GAN存在着以下问题: 训练困难 训练不稳定,需要小心地平衡生成器和判别器的训练程度 生成器和判别器的loss无法指示训练进程 没有可以用来指示训练进程的损失函数,该函数值越小表明GAN训练得越好 生成样本缺乏多样性的问题 需要精心设计网络架构 想要理解WGAN如何解决这些问题,需要阅读以下两篇文章: Towards Principled Methods for Training Generative Adversarial Networks 这篇论文从理论上分析了GAN为什么会存在上述问题。 Wasserstein GAN 这篇论文给出了改进算法。 作者实现PyTorch: https://github.com/martinarjovsky/WassersteinGAN TensorFlow实现: https://github.com/Zardinality/WGAN-tensorflow 来源: CSDN 作者: Vic时代 链接: https://blog.csdn.net/VictoriaW/article/details/56486471

GAN论文阅读——原始GAN(Tensorflow实现)

梦想与她 提交于 2019-12-05 10:44:30
参考资料: https://github.com/jiqizhixin/ML-Tutorial-Experiment/blob/master/Experiments/tf_GAN.ipynb 我们的实验主要基于mnist数据集用Tensorflow实现GAN模型。 首先我们import所有要用的包: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import os 定义几个会用到的函数: #该函数将给出权重初始化的方法 def variable_init (size) : in_dim = size[ 0 ] #计算随机生成变量所服从的正态分布标准差 w_stddev = 1. / tf.sqrt(in_dim / 2. ) return tf.random_normal(shape=size, stddev=w_stddev) #定义一个可以生成m*n阶随机矩阵的函数,该矩阵的元素服从均匀分布,随机生成的z就为生成器的输入 def sample_Z (m, n) : return np

WGAN介绍

和自甴很熟 提交于 2019-12-05 10:44:13
WGAN可谓是继原作GAN之后又一经典之作,本文将介绍一下WGAN WGAN的 前作 中对原始GAN存在的问题作了严谨的数学分析。原始GAN问题的根源可以归结为两点,一是等 价优化的距离衡量(KL散度、JS散度)不合理,二是生成器随机初始化后的生成分布很难与真实分布有不可忽略的重叠(上升到高维时)从而导致在判别器 优化的很好的时候生成器会有梯度消失的情况发生。对于生成分布与真实分布的重叠问题在WGAN前作中粗略的提及到改进的办法,那就是对生成样本和真实 样本加噪声。 原文对此处描述为:通过对生成样本和真实样本加噪声,使得原本的两个低维流形“弥散”到整个高维空间,强行让它们产生不可忽略的重叠。而一旦存在重 叠,JS散度就能真正发挥作用,此时如果两个分布越靠近,它们“弥散”出来的部分重叠得越多,JS散度也会越小而不会一直是一个常数,于是生成器梯度消 失的问题就解决了。在训练过程中,我们可以对所加的噪声进行退火(annealing),慢慢减小其方差,到后面两个低维流形“本体”都已经有重叠时,就算 把噪声完全拿掉,JS散度也能照样发挥作用,继续产生有意义的梯度把两个低维流形拉近,直到它们接近完全重合。 这样的加噪声对训练模型真的有大幅度提高吗?显然这样做是不够的,文章中解释为加噪声后JS散度的具体数值受到噪声的方差影响,随着噪声的退火,前 后的数值就没法比较了

原始GAN网络Tensorflow实现MNIST图片生成(附详细注释)

折月煮酒 提交于 2019-12-05 10:43:38
原始GAN网络论文(非常经典)介绍: https://arxiv.org/pdf/1406.2661.pdf 数据集采用的是黑白图像数据集MNIST。话不多说,直接上代码: 1. 导入必要的库 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec #可视化库 import os 2. 权重初始化函数 # 权重初始化函数方法 def variable_init(size): in_dim = size[0] # 计算随机生成变量所服从的正态分布标准差 w_stddev = 1. / tf.sqrt(in_dim / 2.0) return tf.random_normal(shape=size, stddev=w_stddev) #从服从指定正太分布的数值中取出指定个数的值 3. 变量定义 # 定义输入矩阵的占位符,输入层单元为784,None批量大小的占位,X代表输入的真实图片。占位符的数值类型为32位浮点型 X = tf.placeholder(tf.float32, shape=[None,

初识GAN之MNIST手写数字的识别

南笙酒味 提交于 2019-12-05 10:38:54
初识GAN,因为刚好在尝试用纯python实现手写数字的识别,所以在这里也尝试了一下。笔者也是根据网上教程一步步来的,不多说了,代码如下: from tensorflow . examples . tutorials . mnist import input_data import tensorflow as tf mnist = input_data . read_data_sets ( 'MNIST_data' , one_hot = True ) #下载文件在MNIST_data文件夹中 sess = tf . InteractiveSession ( ) def conv2d ( x , w ) : return tf . nn . conv2d ( x , w , strides = [ 1 , 1 , 1 , 1 ] , padding = 'SAME' ) def max_pool_2x2 ( x ) : return tf . nn . max_pool ( x , ksize = [ 1 , 2 , 2 , 1 ] , strides = [ 1 , 2 , 2 , 1 ] , padding = 'SAME' ) x = tf . placeholder ( tf . float32 , [ None , 784 ] ) y_ = tf .

keras学习笔记(三)

我是研究僧i 提交于 2019-12-05 10:36:46
数据归一化 通过上次对cifar10数据集分类的任务,我的分类精度在0.79,但是当我对输入的数据做了归一化后,精度达到了0.99,实现的语句如下: X_train = X_train.astype('float32')/255 X_test = X_test.astype('float32')/255 Y_train =Y_train.reshape(Y_train.shape[0])/10 Y_test = Y_test.reshape(Y_test.shape[0])/10 对输入进行归一化处理。对标签也进行归一化处理。是数据预处理的一种常见的手段。 数据归一化与标准化存在一定区别,归一化是数据标准化的一种典型做法,即将数据统一映射到[0,1]区间上. 数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间. 归一化最明显的在神经网络中的影响有如下几个方面: 1.有利于初始化的进行 2.避免给梯度数值的更新带来数字的问题 3.有利于学习率的调整 4.加快寻找最优解的速度 上篇博客说了上面那段是自己写的,下面那段是网上别人写的。我自己写的进行了标准化前是0.79的精度,标准化后是0.99的精度,很显然看出数据标准化对精度是有一定影响的。但是后面的那段我并没有看到有数据归一化,结果仍然能达到0.99.暂时还不清楚原因。可能是我选用了不同的损失函数的原因吧,可以自己进行更改验证