GAN生成对抗网络学习笔记

1.GAN诞生背后的故事:

GAN创始人 Ian Goodfellow 在酒吧微醉后与同事讨论学术问题,当时灵光乍现提出了GAN初步的想法,不过当时并没有得到同事的认可,在从酒吧回去后发现女朋友已经睡了,于是自己熬夜写了代码,发现还真有效果,于是经过一番研究后,GAN就诞生了,一篇开山之作。论文《Generative Adversarial Nets》首次提出GAN。

论文链接:https://arxiv.org/abs/1406.2661

2.GAN的原理:

GAN的主要灵感来源于博弈论中零和博弈的思想,应用到深度学习神经网络上来说,就是通过生成网络G(Generator)和判别网络D(Discriminator)不断博弈,进而使G学习到数据的分布,如果用到图片生成上,则训练完成后,G可以从一段随机数中生成逼真的图像。G, D的主要功能是:

G是一个生成式的网络,它接收一个随机的噪声z(随机数),通过这个噪声生成图像

D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片

训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量辨别出G生成的假图像和真实的图像。这样,G和D构成了一个动态的“博弈过程”,最终的平衡点即纳什均衡点.

通俗意思就是在犯罪分子造假币和警察识别假币的过程中

[1]生成模型G相当于制造假币的一方,其目的是根据看到的钱币情况和警察的识别技术,去尽量生成更加真实的、警察识别不出的假币。

[2]判别模型D相当于识别假币的一方,其目的是尽可能的识别出犯罪分子制造的假币。这样通过造假者和识假者双方的较量和朝目的的改进,使得最后能达到生成模型能尽可能真的钱币、识假者判断不出真假的纳什均衡效果(真假币概率都为0.5)。

如图所示:

3.GAN的原理图:

4.GAN的特点:

相比较传统的模型,他存在两个不同的网络,而不是单一的网络,并且训练方式采用的是对抗训练方式

GAN中G的梯度更新信息来自判别器D,而不是来自数据样本

5.GAN 的优点:

GAN是一种生成式模型,相比较其他生成模型(玻尔兹曼机和GSNs)只用到了反向传播,而不需要复杂的马尔科夫链

相比其他所有模型, GAN可以产生更加清晰,真实的样本

GAN采用的是一种无监督的学习方式训练,可以被广泛用在无监督学习和半监督学习领域

相比于变分自编码器, GANs没有引入任何决定性偏置( deterministic bias),变分方法引入决定性偏置,因为他们优化对数似然的下界,而不是似然度本身,这看起来导致了VAEs生成的实例比GANs更模糊

相比VAE, GANs没有变分下界,如果鉴别器训练良好,那么生成器可以完美的学习到训练样本的分布.换句话说,GANs是渐进一致的,但是VAE是有偏差的

GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,不管三七二十一,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了。

6.GAN的缺点:

训练GAN需要达到纳什均衡,有时候可以用梯度下降法做到,有时候做不到.我们还没有找到很好的达到纳什均衡的方法,所以训练GAN相比VAE或者PixelRNN是不稳定的,但我认为在实践中它还是比训练玻尔兹曼机稳定的多

GAN不适合处理离散形式的数据,比如文本

GAN存在训练不稳定、梯度消失、模式崩溃的问题(目前已解决)

7.训练GAN的一些技巧:

输入规范化到(-1,1)之间,最后一层的激活函数使用tanh(BEGAN除外)

使用wassertein GAN的损失函数,

如果有标签数据的话,尽量使用标签,也有人提出使用反转标签效果很好,另外使用标签平滑,单边标签平滑或者双边标签平滑

使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm

避免使用RELU和pooling层,减少稀疏梯度的可能性,可以使用leakrelu激活函数

优化器尽量选择ADAM,学习率不要设置太大,初始1e-4可以参考,另外可以随着训练进行不断缩小学习率,

给D的网络层增加高斯噪声,相当于是一种正则。

8.GAN的延伸有哪些:

DCGAN

CGAN

ACGAN

infoGAN

WGAN

SSGAN

Pix2Pix GAN

Cycle  GAN

9.GAN可以做什么:答案是生成数据

生成音频

生成图片(动物:猫,狗等;人脸图片,人脸图转动漫图等)

.......

先来个美食图缓一缓(学累就先吃一点东西,哈哈哈)

继续!!!!!

10.GAN的经典案例:生成手写数字图片

源码和数据集获取方式在下方

有py格式和ipynb格式两种(代码是一样的)

代码如下:

# -*- coding: utf-8 -*-

"""

Created on 2020-10-31

@author: 李运辰

"""

#导入数据包

import tensorflow as tf

from tensorflow import keras

from tensorflow.keras import layers

import matplotlib.pyplot as plt

#get_ipython().run_line_magic('matplotlib', 'inline')

import numpy as np

import glob

import os

# # 输入

(train_images,train_labels),(_,_)=tf.keras.datasets.mnist.load_data()

train_images = train_images.astype('float32')

# # 数据预处理

train_images=train_images.reshape(train_images.shape[0],28,28,1).astype('float32')

#归一化 到【-1,1】

train_images = (train_images -127.5)/127.5

BTATH_SIZE=256

BUFFER_SIZE=60000

#输入管道

datasets = tf.data.Dataset.from_tensor_slices(train_images)

#打乱乱序,并取btath_size

datasets = datasets.shuffle(BUFFER_SIZE).batch(BTATH_SIZE)

# # 生成器模型

def generator_model():

model = tf.keras.Sequential()

model.add(layers.Dense(256,input_shape=(100,),use_bias=False))

#Dense全连接层,input_shape=(100,)长度100的随机向量,use_bias=False,因为后面有BN层

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())#激活

#第二层

model.add(layers.Dense(512,use_bias=False))

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())#激活

#输出层

model.add(layers.Dense(28*28*1,use_bias=False,activation='tanh'))

model.add(layers.BatchNormalization())

model.add(layers.Reshape((28,28,1)))#变成图片 要以元组形式传入

return model

# # 辨别器模型

def discriminator_model():

model = keras.Sequential()

model.add(layers.Flatten())

model.add(layers.Dense(512,use_bias=False))

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())#激活

model.add(layers.Dense(256,use_bias=False))

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())#激活

model.add(layers.Dense(1))#输出数字,>0.5真实图片

return model

# # loss函数

cross_entropy=tf.keras.losses.BinaryCrossentropy(from_logits=True)#from_logits=True因为最后的输出没有激活

# # 生成器损失函数

def generator_loss(fake_out):#希望fakeimage的判别输出fake_out判别为真

return cross_entropy(tf.ones_like(fake_out),fake_out)

# # 判别器损失函数

def discriminator_loss(real_out,fake_out):#辨别器的输出 真实图片判1,假的图片判0

real_loss=cross_entropy(tf.ones_like(real_out),real_out)

fake_loss=cross_entropy(tf.zeros_like(fake_out),fake_out)

return real_loss+fake_loss

# # 优化器

generator_opt=tf.keras.optimizers.Adam(1e-4)#学习速率

discriminator_opt=tf.keras.optimizers.Adam(1e-4)

EPOCHS=500

noise_dim=100 #长度为100的随机向量生成手写数据集

num_exp_to_generate=16 #每步生成16个样本

seed=tf.random.normal([num_exp_to_generate,noise_dim]) #生成随机向量观察变化情况

# # 训练

generator=generator_model()

discriminator=discriminator_model()

# # 定义批次训练函数

def train_step(images):

noise = tf.random.normal([num_exp_to_generate,noise_dim])

with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:

#判别真图片

real_out = discriminator(images,training=True)

#生成图片

gen_image = generator(noise,training=True)

#判别生成图片

fake_out = discriminator(gen_image,training=True)

#损失函数判别

gen_loss = generator_loss(fake_out)

disc_loss = discriminator_loss(real_out,fake_out)

#训练过程

#生成器与生成器可训练参数的梯度

gradient_gen = gen_tape.gradient(gen_loss,generator.trainable_variables)

gradient_disc = disc_tape.gradient(disc_loss,discriminator.trainable_variables)

#优化器优化梯度

generator_opt.apply_gradients(zip(gradient_gen,generator.trainable_variables))

discriminator_opt.apply_gradients(zip(gradient_disc,discriminator.trainable_variables))

# # 可视化

def generator_plot_image(gen_model,test_noise):

pre_images = gen_model(test_noise,training=False)

#绘图16张图片在一张4x4

fig = plt.figure(figsize=(4,4))

for i in range(pre_images.shape[0]):

plt.subplot(4,4,i+1) #从1开始排

plt.imshow((pre_images[i,:,:,0]+1)/2,cmap='gray') #归一化,灰色度

plt.axis('off') #不显示坐标轴

plt.show()

def train(dataset,epochs):

for epoch in range(epochs):

for image_batch in dataset:

train_step(image_batch)

#print('第'+str(epoch+1)+'次训练结果')

if epoch%10==0:

print('第'+str(epoch+1)+'次训练结果')

generator_plot_image(generator,seed)

train(datasets,EPOCHS)

训练结果:

第1次训练结果

第100次训练结果

结论:

在100次训练后,可以明显看到数字的内容,到训练了300次之后就可以很清楚看到生成的数字效果,但300次之后,400,500次效果逐渐下降。图片内容变模糊。

正文结束!!!!

源码和数据集获取方法

公众号回复【GAN】免费获取

欢迎关注公众号:Python爬虫数据分析挖掘

记录学习python的点点滴滴;

回复【开源源码】免费获取更多开源项目源码;

公众号每日更新python知识和【免费】工具;

本文已同步到【开源中国】和【腾讯云社区】;

gan处理自己的数据集_数据集难找?GAN生成你想要的数据!!!相关推荐

  1. 数据开放 数据集_除开放式清洗之外:叙述是开放数据门户的未来吗?

    数据开放 数据集 There is growing consensus in the open data community that the mere release of open data - ...

  2. nci60数据集_数据集 | 图网络一般适用的数据集整理

    文 | 灵犀一指 本文从图网络的现有论文中梳理出了目前图网络被应用最多的数据集,主要有三大类,分别是引文网络.社交网络和生物化学图结构,分类参考了论文<A Comprehensive Surve ...

  3. python生成树形图_如何使用Python生成树形图(treemap)所需数据

    被这个问题稍微难住了下,找到答案后不敢独享,希望能帮助其他朋友吧. raw_data = [ ("A1", "B1", "C1", 1), ...

  4. drive数据集_英伟达的最强人脸GAN开源了,它吃的高清数据集也开源了

    栗子 假装发自 凹非寺 量子位 出品 | 公众号 QbitAI 你大概还没忘记,英伟达去年年底推出的GAN,它合成的人脸甚至骗得过肉眼. 如今,它终于有了自己的名字,叫StyleGAN.顾名思义,GA ...

  5. GAN属于计算机视觉领域嘛_计算机视觉领域必知的开放数据集

    机器学习领域有一句经典格言,"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已".但是,从哪里获得数据呢? 计算机视觉 下面介绍一系列公开可用的计算机视觉领域高质量 ...

  6. nasa数据库cm1数据集_获取下一个地理项目的NASA数据

    nasa数据库cm1数据集 NASA provides an extensive library of data points that they've captured over the years ...

  7. 机器学习 啤酒数据集_啤酒数据集上的神经网络

    机器学习 啤酒数据集 Artificial neural networks (ANNs), usually simply called neural networks (NNs), are compu ...

  8. 熊猫数据集_对熊猫数据框使用逻辑比较

    熊猫数据集 P (tPYTHON) Logical comparisons are used everywhere. 逻辑比较随处可见 . The Pandas library gives you a ...

  9. 熊猫数据集_大熊猫数据框的5个基本操作

    熊猫数据集 Tips and Tricks for Data Science 数据科学技巧与窍门 Pandas is a powerful and easy-to-use software libra ...

  10. 熊猫数据集_熊猫迈向数据科学的第一步

    熊猫数据集 I started learning Data Science like everyone else by creating my first model using some machi ...

最新文章

  1. AMD规范:简单而优雅的动态载入JavaScript代码
  2. TV Battle --HOJ 11915
  3. 网络基础---IP编址
  4. day24-抽象类与接口类
  5. Python将csv格式转换为xlsx
  6. windows下Apache 启动出错的解决
  7. vue中Component错误
  8. python超市管理系统流程图_python实现超市管理系统(后台管理)
  9. 城市大脑总体框架和主要平台
  10. RGB渐变色与HSL渐变色
  11. 怎么把半角引号替换成全角_巧妙批量互换全角与半角双引号
  12. HDU 4960:Another OCD Patient
  13. 高数_第6章无穷级数
  14. JavaScript中实现键值对的方法
  15. 智慧管廊监控与报警管控一体化系统解决方案
  16. 微信小程序开发笔记 支付篇③——微信支付JSAPI下单和微信小程序调起支付(V2版本)
  17. 软件测试二分查找函数,二分查找
  18. 解决office2003,无法卸载也无法安装问题
  19. python第六章习题答案
  20. 数字集成电路物理设计学习总结——布图规划和布局

热门文章

  1. 戴德金--连续性和无理数--我自己做的中文翻译第5页
  2. [机缘参悟-74]:沟通技巧-无论在职场还是在家,尽量少用反问句
  3. 校园火灾项目Focuse-1
  4. java音乐播放器代码_java 音乐播放器 示例源码(亲测可用)
  5. Android 9.0 解决无法通过adb install 安装persistent app
  6. python世界杯问题
  7. Linux 课程设计 每日小
  8. 一阶微分方程解的存在定理
  9. 悟--心智成熟的旅程
  10. 非IE浏览器下ActiveX技术的替代方案