GAN生成对抗网络

生成对抗网络(GAN)是一种深度学习模型,由生成器和判别器组成,两者在训练中形成动态博弈,生成器试图生成逼真的图像以欺骗判别器,而判别器则努力区分真实与生成的图像。GAN广泛应用于图像生成、图像增强、艺术创作等领域,本文还提供了一个简单的GAN入门代码示例,展示了如何在TensorFlow2.0中构建和训练模型。

1 GAN简介

生成对抗网络(GAN,Generative Adversarial Networks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。由2014年还在蒙特利尔读博士的lan Goodfellow引入深度学习领域。2016年,GAN热潮席卷AI领域顶级会议,从ICLR到NIPS,大量高质量论文被发表和探讨。Yann LeCun曾评论GAN是“20年来机器学习领域最酷的想法”。

机器学习的模型可大体分为两类:生成模型(Generative Model)和判别模型(Discriminative Model)。判别模型需要输入变量,通过某种模型来预测。生成模型是给定某种隐含信息,来随机产生观测数据。

GAN是更好的生成模型

2 GAN原理

GAN主要包括了两个部分,即生成器generator与判别器discriminator。生成器主要用来学习真实图像分布,从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对接受的图片进行真假判断。

图

在训练过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗,最终两个网络达到了一个动态平衡:生成器生成的图像接近于真实图像的分布,而辨别器识别不出真假图像,对于给定图像的预测为真的概率基本接近0.5(相当于随机猜测类别)

2.1 GAN原理举例

比如制造假币的团伙就相当于生成器,它们想通过伪造真钱来骗过银行,使得假币能够正常交易,而银行相当于判别器,需要判断进来的钱是真钱还是假币。因此假币团伙的目的是制造出银行识别不出的假币,而银行则是要想办法准确地识别出假币。

2.2 GAN原理总结

对于给定的真实图片,判别器要为其打上标签1;
对于给定的生成图片,判别器要为其打上标签0;
对于生成器传给判别器的生成图片,生成器希望判别器打上标签1。

训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开。

这样,G和D就构成了一个动态的“博弈过程”。

那么博弈的结果是什么呢?
在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。

目的:得到了一个生成模型G,可以用来生成图片。

3 GAN设计

图

4 GAN应用领域

  • 图像生成
  • 图像增强
  • 风格化
  • 艺术的图像创造

5 GAN入门代码示例

5.1 加载数据库

import tensorflow as tf 
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import glob
import os

查看TensorFlow版本,这里使用tensorflow2.0。关于TensorFlow的知识后面有时间会写博客,还记得去年暑假,学了两个星期,结果开学不久TensorFlow迎来了2.0,并购了Keras等优秀的模型框架,算是彻底和1.x说了再见,计算图、会话彻底成为了过去时,后来不得不从新学习TensorFlow2.0。不过他不会让你失望,值得你付出的时间。

tf.__version__

在这里插入图片描述
使用内部MNIST数据集

 #这里不需要测试数据集,所以用占位符去掉
(train_images,train_labels),(_,_) = tf.keras.datasets.mnist.load_data()    

5.2 数据预处理

train_images.shape

在这里插入图片描述

#把数据变成图片的格式
train_images = train_images.reshape(train_images.shape[0],28,28,1)    
train_images.shape     

在这里插入图片描述

train_images.dtype

在这里插入图片描述

 #把数据类型转换成float数据类型
train_images = train_images.astype('float32')           

对数据做归一化处理;
目的:使数据的范围落在0的周围,因为激活函数在0的周围能发挥最好的作用;
因为图片数据的取值范围是(0-255)–>(-1,1)。

#对数据做归一化处理
train_images = (train_images - 127.5)/127.5
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值