GAN初识

1. 生成对抗网络GAN简介

1.1 生成器

G(Z)接受随机噪声Z作为输入生成仿品,并训练自己去欺骗判别器D,让D以为G(Z)产生的任何数据都是真实的。

1.2 判别器

D(Y)可以基于真品和仿品来判断仿造品的仿真程度,通常值越靠近0表示越真实(靠近1表示仿造)。其目标是:使每个真实数据分布中的图像的D(Y)值最大化,并使真实数据分布之外的图像D(Y)值最小化。

1.3 训练原理

生成器和判别器进行一个相对立的博弈,因此名为对抗性训练。一般以交替方式训练G和D,其目标函数表示为损失函数,并用梯度下降算法进行优化。D和G都通过反向传播来调整生成器的参数,这样G就能够学习如何在越来越多的情况下欺骗D,最后G将学习如何生成可以以假乱真的仿造图片。

2. 实现DCGAN网络

小知识:

(1)LeakyReLU允许单元未激活时有个小的梯度,在许多情况下,它能提高GAN的性能。

(2)BatchNormalization() 批归一化通过将每个单元的输入归一化为0均值、单位方差,来帮助稳定学习的技术。在许多情况下加快了训练,减少了初始化不良的问题 ,并且能更普遍地产生更准确的结果。

2.1 定义生成器G

python 复制代码
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense, Dropout
from keras.datasets import cifar10
from keras.utils import np_utils
from keras.optimizers import RMSprop

def generator_model():
    model = Sequential()
    model.add(Dense(input_dim=100, output_dim=1024))
    model.add(Activation('tanh'))
    model.add(Dense(128*7*7))
    model.add(BatchNormalization())
    model.add(Activation('tanh'))
    model.add(Reshape((128, 7, 7), input_shape=(128*7*7,)))
    model.add(UpSampling2D(size=(2, 2)))
    model.add(Conv2D(64, 5, 5, border_mode='same'))
    model.add(Activation('tanh'))
    model.add(UpSampling2D(size=(2, 2)))
    model.add(Conv2D(1, 5, 5, border_mode='same'))
    model.add(Activation('tanh'))
    return model
    # 注意:这里的卷积网络没有任何池化操作

2.2 定义判别器D

python 复制代码
def discriminator_model():
    model = Sequential()
    model.add(Dense(input_dim=100, output_dim=1024))
    model.add(Conv2D(64, 5, 5, border_mode='same', input_shape=(1, 28, 28)))
    model.add(Activation('tanh'))
    model.add(MaxPooling2D(pool_size(2, 2)))
    model.add(Conv2D(128, 5, 5))
    model.add(Activation('tanh'))
    model.add(MaxPooling2D(pool_size(2, 2)))
    model.add(Flatten())
    model.add(Dense(1024))
    model.add(Activation('tanh'))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    return model

2.3 组合

python 复制代码
# 一个对抗模型,其 G和 D基于相同的模型 M
adversarial_model = AdversarialModel(base_model=M,
                                     player_params=[generator.trainable_weights, discriminator.trainable_weights],
                                     player_names=['generator', 'discriminator'])
# G和D基于两个不同的模型
adversarial_model = AdversarialModel(player_models=[gan_g, gan_d],
                                     player_params=[generator.trainable_weights, discriminator.trainable_weights],
                                     player_names=['generator', 'discriminator'])
相关推荐
月疯5 小时前
CNN卷积和反卷积输出的计算方法
深度学习·神经网络·cnn
直接冲冲冲5 小时前
鱼书-PH4-类的作用
深度学习
EQUINOX18 小时前
【论文阅读】| MoCo精读
论文阅读·人工智能·python·深度学习·机器学习
程序喵大人9 小时前
【AI专栏】图解Transformer - 第05章:LLM 推理工程
人工智能·深度学习·llm·transformer
bing_feilong11 小时前
FAST_LIO2(2): 运行记录
机器学习·slam
Day(AKA Elin)11 小时前
【Day】MTP(Multi Token Prediction)技术学习
python·深度学习·学习·llama
卡梅德生物科技小能手12 小时前
卡美德生物科普IL25:2型免疫反应的核心调控靶点
经验分享·深度学习·生活
城事漫游Molly12 小时前
用AI提炼研究问题与假设的完整提示词——从模糊想法到精准RQ/Hypothesis,AI辅助精化全流程
人工智能·机器学习·prompt·ai for science·博士生必读·应用语言学·研究问题
workflower12 小时前
室内外配送机器人-应用路径
人工智能·机器学习·设计模式·矩阵·自动化
AI人工智能+13 小时前
护照OCR识别技术,依托深度神经网络模型,实现了从像素到语义的端到端智能解析
深度学习·计算机视觉·自然语言处理·ocr·护照ocr识别