深度学习100例-生成对抗网络(GAN)手写数字生成 | 第18天(一)

GAN(Generative Adversarial Networks)是两个网络的的组合, 一个网络生成模拟数据, 另一个网络判断生成的数据是真实的还是模拟的。生成模拟数据的网络要不断优化自己让判别的网络判断不出来, 判别的网络也要优化自己让自己判断得更准确。 二者关系形成对抗博弈,因此叫对抗神经网络(生成对抗网络)。实验证明, 利用这种网络间的对抗关系所形成的网络, 在无监督及半监督领域取得了很好的效果, 可以算是用网络来监督网络的一个自学习过程。

通过训练两个相互对抗的神经网络解决了非监督学习问题,其中一个是生成(Generator)网络,另一个叫判别(discriminator)网络。

GAN可以借助假币伪造者(生成网络)和 警察(判别网络)的例子来理解。最初,伪造者向警察展示随机生成的假钞票,警察识别出钞票是假的,伪造者根据收到的反馈制造了新的假钞票。如此重复相当多次,直到伪造者可以造出警察无法识别、足以以假乱真的钞票。在GAN的场景中,最后得到了可以生成和真实图片非常相似的图片的生成网络,以及可以高度识别伪造品的判别网络。

GAN是伪造网络和专家网络的联合,每个网络都被训练来打败对方。生成网络以随机变量为输入并生成一张合成图片。判别网络拿到输入的图片,并判断图片是真实的还是伪造的。我们给判别网络要么传入一张真实图片,要么传入一张伪造图片。生成网络训练生成图片,欺骗判别网络,想让其相信图片是真实的。判别网络也会持续改进,基于得到的反馈反进行欺骗训练。

将库导入好,然后是定义参数

from keras import layers, datasets, Sequential, Model, optimizers
from keras.layers import LeakyReLU, UpSampling2D, Conv2D

import matplotlib.pyplot as plt
import numpy as np
import sys,os,pathlib

img_shape  = (28, 28, 1)
latent_dim = 200

img_shape  = (28, 28, 1)意思为图像的通道数为1,尺寸大小为28*28,通道数为1表示是灰度图

latent_dim = 200  找了半天也没找到它是啥意思。

构建生成器,接收随机数并返回生成图像。

def build_generator():
    # ======================================= #
    #     生成器,输入一串随机数字生成图片
    # ======================================= #
    model = Sequential([
        layers.Dense(256, input_dim=latent_dim),
        layers.LeakyReLU(alpha=0.2),  # 高级一点的激活函数
        layers.BatchNormalization(momentum=0.8),  # BN 归一化

        layers.Dense(512),
        layers.LeakyReLU(alpha=0.2),
        layers.BatchNormalization(momentum=0.8),

        layers.Dense(1024),
        layers.LeakyReLU(alpha=0.2),
        layers.BatchNormalization(momentum=0.8),

        layers.Dense(np.prod(img_shape), activation='tanh'),
        layers.Reshape(img_shape)
    ])

    noise = layers.Input(shape=(latent_dim,))
    img = model(noise)

    return Model(noise, img)

活动地址:CSDN21天学习挑战赛

你可能感兴趣的:(深度学习,python,人工智能,神经网络,生成对抗网络)