DCGAN深度卷积生成对抗网络&python自动绘图

GAN

生成对抗网络
是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。

举例说明

我们可以通过一个简单的例子来解释GAN的基本原理。我们使用情侣间的拍照片来解释GAN的原理,男生给女友拍照,男生的拍照技术通常很烂(。。。),我们把生成网络比作是男友,那么判别网络就是女友,男生拍完一张照片后给女友看,生成网络负责从随机生成数据,在这里比作是照片。拍完一张给女友看,那么女友就可以看做是判别网络,负责找出男生给出的数据与真实值之间的差别,不断的拍照不断的判别,直到找到判别网络无法判断是生成的还是真实数据为止。

GAN生成对抗网络

就是由两个神经网络组成,一个生成网络,与一个判别网络,让两个神经网络以相互博弈的方式进行学习。

什么是DCGAN

DCGAN是GAN的一个变体。
Deep Convolutional GAN 深度卷积生成对抗网络。
里面有生成器和判别器两个模型
生成模型和判别模型都运用了深度卷积 神经网络的生成对抗网络
Gan里面生成模型和判别模型也是用到了神经网络。
在DCGAN中生成器用到了反卷积神经网络,判别器用到了卷积神经网络。

卷积神经网络基本原理

经过卷积层提取它的一些特征信息。池化层进行亚采样,再经过卷积层池化层。将信息逐层深入的去解析。例如给出一张带有各种形状的图片,最后经过处理提取出一些简单的特征代表该图像

反 卷积神经网络的基本原理

由简单到复杂地反向生成。例如,简单的给出一些图像的特征,最后经过一层一层的处理,最后生成图像。

在这里插入图片描述

判别器模型

在这里插入图片描述

自动生成图片

本篇论文中的程序主要是引用论文UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS中提出的DCGAN模型,进行自动绘图的代码实现。首先是对判别器生成器模型的定义,然后进行数据集的训练,本文用到的数据集有几万张,由于图像像素小,所以用CPU训练是完全可以跑起来的。

核心算法主要用到了一类称为深度卷生成对抗网络(DCGAN)的CNN,DCGAN的全称是Deep Convolutional Generative Adversarial Networks,意即深度卷积对抗生成网络,它是由Alec Radford在论文Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks中提出的。它是在GAN的基础上增加深度卷积网络结构,用于专门生成图像样本,它的一些架构特征表明这种算法非常适合无监督学习。
通过使用DCGAN对各种图像数据集进行训练,DCGAN中的生成器G和判别器D的含义以及损失都和原始GAN中完全一致,于判别器D,判别器D的结构是一个卷积神经网络,它的输入是一张图像,输入的图像经过若干层卷积后得到一个卷积特征,输出是这张图像为真实图像的概率。对于生成器G,它的输入为随机噪声输入。通过搭建模型深度卷积生成对抗网络,可以学习从生成器和鉴别器中的对象部分到场景的表示之间的层次结构,并能顺利的完成图形生成任务。

编程环境

OS:Ubuntu 16.04
Python2.7
TensorFlow 1.4 CPU版本
Pilliow(Python的图像处理库)
numpy(数学函数库)

代码

判别器模型:

在这里插入图片描述

在这里插入图片描述

第一层:卷积层,输入图像大小为64643,卷积核大小55,输出的深度大小为64,padding=2,表示输出的大小不变,因此需要在外围补零2圈。添加 Tanh 激活层。
第二层:池化层,使用的是MaxPool2D,pool_size=(2, 2)
第三层:第二层卷积层Conv2D,卷积核大小5
5,128个过滤器,并且使用tanh激活函数。
第四层:池化层MaxPool2D,池化层的过滤器大小pool_size=(2, 2))。
第五层:第三层卷积层Conv2D,激活函数继续使用tanh。
第六层:MaxPool2D池化层,pool_size=(2, 2)。然后是将六底层的输出进行扁平化的操作Flatten,进行reshape
第七层:全连接层,输出神经元的个数为1024个
第八层:全连接层,输出神经元的个数为1个。最后添加Sigmoid 激活层。

生成器模型:

在这里插入图片描述

第一层:全连接层Dense,这个地方的长和宽是要原始图片反推过来的,然后reshape成图像长度。输入的维度是 100,采用正态分布的随机数,输出维度(也就是说神经元个数)是1024 的全连接层
第二层:全连接层Dense,输出是8192 个神经元的全连接层。然后进行批标准化,对数据进行标准化的操作,把激活函数tanh转换一下。然后再进行reshape操作,转换一下形状,把高和宽转换为88的一个形状Reshape重新改变形状。
第三层:亚采样层,池化的反操作,向上层采样。
第四层:反卷积层Conv2D,参数和上面的一样。输出通道是16
16的图像
第五层:亚采样层UpSampling2D,池化的反操作,向上层采样。高和宽变成32*32
第六层:反卷积层Conv2D,添加激活函数tanh
第七层:亚采样层UpSampling2D,池化的反操作,向上层采样,图像的高和宽变成64 x 64像素。
第八层:反卷积层Conv2D,然后添加激活函数tanh。

由于很多小伙伴私信或评论想要源代码,特此更新文章,贴上完整代码。为了更加直观的方便小伙伴看懂代码,我对代码进行详细的注释,对代码中的每一行代码添加注释。能力有限,可能个别存在错误,欢迎小伙伴批评指正O(∩_∩)O

完整代码:

定义生成器模型和判别器模型的代码

import tensorflow as tf

# Hyper parameter(超参数)

EPOCHS = 100              # 总的轮数 训练的轮数
BATCH_SIZE = 128          # 每一个训练里面 取得包的大小
LEARNING_RATE = 0.0002     # 学习率
BETA_1 = 0.5

# 定义判别器模型

def discriminator_model():
    
	model = tf.keras.models.Sequential()
    # 首先添加一个卷积层
	model.add(tf.keras.layers.Conv2D(
   
		64,  # 64 个过滤器,输出的深度(depth)是 64    也就是说对输入的图像进行64次的扫描,每扫描深度加1   
		(5, 5),  # 过滤器在二维的大小是(5 * 5)       过滤器在二维的高和宽是多大 
		padding='same',  # same 表示输出的大小不变,因此需要在外围补零2圈   过滤器输入和输出大小一样       		
		input_shape=(64, 64, 3)  # 输入形状 [64, 64, 3]。3 表示 RGB 三原色 3彩色的图片   
		 ))
 
	# 添加激活层  tanh激活函数
	# 激活函数的作用是为了增加神经网络模型的非线性。
	#否则你想想,没有激活函数的每层都相当于矩阵相乘。
	#就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
	#所以你没有非线性结构的话,根本就算不上什么神经网络。
	
	model.add(tf.keras.layers.Activation("tanh"))  # 添加 Tanh 激活层   
	
	# 添加池化层  MaxPool
	model.add(tf.keras.layers.MaxPool2D(pool_size=(2, 2)))  # 池化层   过滤器的大小为2*2
	# 添加第二层卷积层,此处不用再input,第一层设置过了,第一层的输出作为layers.Activation
  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值