DCGAN整理总结

GAN

什么是GAN?

       GAN是一个教深度学习模型捕捉训练数据的布局来从该布局中生成新数据的框架。最早是2014年Ian Goodfellow提出的。GAN主要由两部分模型组成——生成器和判别器。
       生成器的工作是生成极像训练数据的“假”数据,判别器的工作是判断一张照片是一个真实的训练照片还是生成器生成的假照片。训练时,生成器尝试生成越来越好的假照片来欺骗判别器,而判别器不断更好的发现和正确辨别真实的和假冒的照片。
       博弈的平衡点是当生成器生成的伪造品看起来像直接来自训练数据时,而鉴别器则总是猜测生成器输出是真实还是伪造品的置信度为50%

GAN重要参数及损失函数

由于是处理图像,输入判别器的图像大小为CHW:3X64X64

x:图像的数据表征
D(x):判别器输出的判断x来自真实训练数据的可能性(当x来自真实训练集,该值应该偏大,当x为生成器生成的,则该值应该偏小)可以看做是一个传统的二分类

z:是一个从标准正态分布中抽样的隐空间向量
G(z):表示生成器从隐向量z映射到数据空间的函数(G的目的是估计训练数据来自的分布(pdata),从而可以从**估计的分布(pg)**中生成假的样本)

D(G(z)):是判断生成器G的输出是一个真实图像的概率。

实际上,D和G在玩一个minimax游戏,D尽力去最大化正确区分真假的概率(logD(x)),G尽力去最小化D预测G的输出是假的的概率(log(1−D(G(x))))。

从而得出GAN的损失函数:
minGmaxD V(D,G)=Ex~pdata(x)[logD(x)]+Ez~pz(z)[log(1−D(G(z)))]

理论上说,这个minimax游戏的最终结果是pg=pdata,并且判别器是随机猜测输入是真或假。
实际上,该收敛理论仍在积极研究中,模型并不总是能达到该目的。

DCGAN

什么是DCGAN?

深度学习中对图像处理应用最好的模型是CNN,DCGAN是把CNN与GAN相结合的一次尝试。

DCGAN与GAN的原理是一样的,只是把D和G换成了两个卷积神经网络。但并不是直接替换,而是对卷积神经网络结构做了一些改变,来提高样本质量和收敛速度。

DCGAN结构

DCGAN结构

主要有以下改变:

  • 取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
  • 在D和G中均使用batch normalization(批归范化)
  • 去掉FC(全连接)层,使网络变为全卷积网络
  • G网络中使用ReLU作为激活函数,最后一层使用tanh
  • D网络中使用LeakyReLU作为激活函数

TensorFlow版本MINIST手写体生成模型

以下内容摘自:https://www.tensorflow.org/tutorials/generative/dcgan
导入TensorFlow和其他包:

import tensorflow as tf
import glob
import imageio
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
from tensorflow.keras import layers
import time

from IPython import display

tf.__version__
# '2.3.0'
# 用于生成 GIF 图片
pip install -q imageio

加载和准备数据集:

(train_images, train_labels), (_, _) = f.keras.datasets.mnist.load_data()
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
train_images = (train_images - 127.5) / 127.5 # 将图片标准化到 [-1, 1] 区间内
BUFFER_SIZE = 60000
BATCH_SIZE = 256
# 批量化和打乱数据
train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

生成器结构:

def make_generator_model():
	# 定义一个序列模型
	model = tf.keras.Sequential() 
	# 添加一个全连接层:输入为一个7*7*256的随机种子,不使用偏置项,设置输入大小为100维度。
	model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
	# 添加批处理规范化,加速训练平稳收敛
	model.add(layers.BatchNormalization()) 
	# 是ReLU激活函数的变体,对负值输入有很小的坡度,导数总是不为0,从而减少静默神经元的出现。
	model.add(layers.LeakyReLU()) 

    # 重塑层的形状
    model.add(layers.Reshape((7, 7, 256))) 
    assert model.output_shape == (None, 7, 7, 256) 

    # 添加反卷积层,输出维度128,卷积核大小为5*5,步长为1
    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 7, 7, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    # 添加反卷积层,输出维度64,卷积核大小为5*5,步长为2
    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 14, 14, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    # 添加反卷积层,输出维度1,卷积核大小为5*5,步长为2
    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 28, 28, 1)

    return model

使用未训练的生成器产生一张图片。

generator = make_generator_model()

noise = tf.random.normal([1, 100])
generated_image = generator(noise, training=False)

plt.imshow(generated_image[0, :, :, 0], cmap='gray')

在这里插入图片描述

判别器结构:


def make_discriminator_model():
	# 创建序列模型
	model = tf.keras.Sequential()
	# 之前的反过程:先添加一个卷积层,输出维度为64,卷积核大小5*5,步长为2,输入为28*28*1大小图片
    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',
                                     input_shape=[28, 28, 1]))
    model.add(layers.LeakyReLU())
    # 添加dropout层防止过拟合
    model.add(layers.Dropout(0.3))

    # 添加一个卷积层,输出维度128,卷积核大小5*5,步长为2
    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    # 添加扁平层,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。
    model.add(layers.Flatten())
    # 定义全连接层,输出维度为1
    model.add(layers.Dense(1))

    return model


使用(尚未训练的)判别器来对图片的真伪进行判断。模型将被训练为为真实图片输出正值,为伪造图片输出负值。

discriminator = make_discriminator_model()
decision 
  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值