![a434eded037e562c5f9b2a3689cfe636.png](https://i-blog.csdnimg.cn/blog_migrate/dfb921dcf81a7fb505deeae3eb134e2c.jpeg)
概要
目前仍然在在广州的实习公司继续实习,为了更好的完成任务,以及未来的开题,现在必须仔细学习GAN。之前将GAN和DCGAN两篇论文仔细阅读完了,之后为了检验学习成果写下了这份DCGAN生成手写数字的代码。
虽然是GAN系列的第一篇文章,本想着先从GAN最初论文说起,但是由于很久没更新了博客或者公众号了,想赶紧更新一篇回馈粉丝。巧合的是,GAN的结果展示多为各种图片,转念一想利用讲解代码和展示结果方式来引导GAN系列的开始也不为一个合适的选择。下面开始介绍利用DCGAN生成书写数字。
一、GAN简介
虽然GAN系列第一篇上来就讲解代码,着实让很多小白们难易难以接受。因此我也首先简单介绍一下GAN的原理。
GAN(Generative Adversarial Network)全名叫做对抗生成网络或者生成对抗网络。GAN这一概念是由Ian Goodfellow于2014年提出,并迅速成为了非常火热的研究话题。目前,GAN的变种更是有上千种,2019年计算机界的诺贝尔奖“图灵奖”得主,深度学习先驱之一的Yann LeCun也曾说:"GAN及其变种是数十年来机器学习领域最有趣的想法。"
GAN的主要思想是零和博弈,GAN有两部分组成,一个生成器和一个判别器。生成器主要用于生成图像,判别器用于判别图像是否是“假的”,即图像是否由生成器的概率。GAN的训练可以看成式生成器与判别器之间相互对抗的过程。那么最理想的结果是生成器生成的图像在判别器的预测结果为0.5,即分不清图像是真实图像还是生成器生成的图像。
在原始GAN中,判别器与生成器都是原始的多层感知机即BP神经网络,在DCGAN模型中,BP神经网络都被卷积神经网络所替换。生成器主要是利用一系列反卷积操作将一维噪声向量转化成图像,判别器则是正常的卷积神经网络,将图像进行一系列提取特征之后在判断该图像来自生成器的概率。
二、DCGAN源代码
接下来,我们来介绍利用DCGAN生成手写数字图像。本篇文章的代码全部使用keras进行编写,后端使用的是tensorflow1.14。该项目的源代码网址请移步:
Daipuwei/DCGAN-mnistgithub.com![0945557a4b2bde72bf690e19ebe8f4e8.png](https://i-blog.csdnimg.cn/blog_migrate/5bfe261103033df3a0d95c8ce6326590.jpeg)
首先给出DCGAN的类代码,这份代码主要由初始化函数、生成器搭建函数、判别器搭建函数,DCGAN的训练函数和保存DCGAN生成的图片的函数5部分构成。代码如下所示:
# -*- coding: utf-8 -*-
# @Time : 2019/9/15 9:26
# @Author : DaiPuWei
# @Email : daipuwei@qq.com
# @Blog : https://daipuweiai.blog.csdn.net/
# @File : DCGAN.py
# @Software: PyCharm
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import truncnorm
from keras import Model
from keras import Input
from keras import Sequential
from keras.layers import Conv2D
from keras.layers import BatchNormalization
from keras.layers import Conv2DTranspose
from keras.layers import LeakyReLU
from keras.layers import Activation
from keras.layers import Dropout
from keras.layers import Reshape
from keras.layers import Dense
from keras.layers import Flatten
from keras.optimizers import Adam
from keras.utils.generic_utils import Progbar
class DCGAN(object):
def __init__(self,config,discriminator_weight_path = None,dcgan_weight_path=None):
"""
这是DCGAN的初始化函数
:param config: 网络模型参数配置类
:param discriminator_weight_path: 网络模型参数配置类
:param dcgan_weight_path: 网络模型参数配置类
"""
# 初始化网络相关超参数类
self.config = config
# 构建生成器与判别器
self.generotor_model = self.build_generator_model()
self.discriminator_model = self.build_discriminator_model()
# 构建DCGAN的优化器,并编译判别器
self.optimizier = Adam(lr=self.config.init_learning_rate,
beta_1=self.config.beta1,