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'])
相关推荐
BFT白芙堂3 小时前
基于 Kinova Gen3 机械臂的家庭人机交互安全算法研究
人工智能·深度学习·算法·安全·人机交互·模型训练·具身智能
LaughingZhu12 小时前
Product Hunt 每日热榜 | 2026-03-25
人工智能·经验分享·深度学习·神经网络·产品运营
枫叶林FYL12 小时前
【自然语言处理 NLP】第二章 经典NLP算法与特征工程(Classical NLP Algorithms)
人工智能·深度学习·机器学习
剑穗挂着新流苏31214 小时前
117_PyTorch 实战:利用训练好的模型进行单张图片验证
人工智能·python·深度学习
枫叶林FYL14 小时前
【乳腺癌早期筛查(钼靶X光图像AI识别)】第一章:钼靶AI核心算法架构演进——从2D全视野到3D断层合成与视觉Transformer
人工智能·深度学习
WeeJot嵌入式14 小时前
Meta LSP无数据训练深度解析:语言自我对弈的数学原理与实现
人工智能·机器学习·里氏替换原则
枫叶林FYL15 小时前
【自然语言处理 NLP】数学与计算基础(Mathematical & Computational 完整源码实现
人工智能·深度学习·机器学习
another heaven16 小时前
【深度学习 超参调优】lr0与lrf 的关系
人工智能·深度学习
放下华子我只抽RuiKe516 小时前
深度学习全景指南:硬核实战版
人工智能·深度学习·神经网络·算法·机器学习·自然语言处理·数据挖掘