【GANs】Generative Adversarial Nets

这篇博客深入介绍了生成对抗网络(GANs),包括GANs的基本思想、目标函数、代码实现、全局最优推导以及未来发展方向。GANs通过生成器和判别器的对抗学习,寻找数据的真实分布。文章探讨了如何通过最大化判别器的性能和最小化生成器的性能来优化整个系统,并证明了全局最优解的存在和函数的收敛性。
摘要由CSDN通过智能技术生成

1 GAN

1.1 GANs的简介

Generative Adversarial Nets原文链接

  • 判别器模型(网络):一般熟知的带标签的分类、回归等监督学习都属于判别器模型。学习的是某种分布下的条件概率分布 p ( y ∣ x ) p(y|x) p(yx)

  • 生成器模型(网络):聚类、自动编码器等无监督学习模型。学习的是联合分布概率 p ( x , y ) p(x,y) p(x,y)。通过模型学习到最优的 p ( x ∣ y ) p(x|y) p(xy)

在现实中,判别模型在分类工作中的表现通常优于生成模型,但在一些创造性的工作中显然生成模型更有意义。

1.2 思想与目标函数

生成器和判别器不断对抗博弈,直到两个网络到达最终的动态均衡状态,即判别器无法识别生成器的图像真假。

请添加图片描述
我们想学习到的是像训练集那样的数据分布: p g ( z ) p_g(z) pg(z)➡真实数据分布, z z z是噪声。

但是 我们可知道的是,极大似然函数去找概率分布会有很复杂的计算问题,因此我们才看作者采用的方式,绕过极大似然函数来逼近真实数据分布。

逼近过程

请添加图片描述
x ∼ P d a t a x \sim P_{data} xPdata
z ∼ P z z \sim P_z zPz

  • 我们看训练 D D D(想让 D D D性能高):
if x is from Pdata : D(x)--→ log(D(x))if z is from Pz : D(G(z))--1 - D(G(z))<=> log(1 -  D(G(z)))

得到关于 D D D的目标函数
    D m a x E x ∼ P d a t a [ l o g D ( x ) ] + E z ∼ P z ( 1 − D ( G ( z ) ) ) ^{max}_{\space\space\space D} E_{x \sim P_{data}}[logD(x)] + E_{z \sim P_z}(1-D(G(z)))    DmaxExPdata[logD(x)]+EzPz(1D(G(z)))

  • 在来看训练 G G G(想让 G G G性能高):
z is from Pz : D(z)--1-D(G(z))<=> log(1-D(G(z)))

得到关于 G G G的目标函数:
    G m i n E z ∼ P z ( 1 − D ( G ( z ) ) ) ^{min}_{\space\space\space G} E_{z \sim P_z}(1-D(G(z)))    GminEzPz(1D(G(z)))

G G G D D D的两个目标,得到总的目标函数:(GAN原始论文中的目标函数)
    G m i n     D m a x E x ∼ P d a t a [ l o g D ( x ) ] + E z ∼ P z ( 1 − D ( G ( z ) ) ) {^{min}_{\space\space\space G}} {^{max}_{\space\space\space D}} E_{x \sim P_{data}}[logD(x)] + E_{z \sim P_z}(1-D(G(z)))    Gmin   DmaxExPdata[logD(x)]+EzPz(1D(G(z)))
以这个目标函数训练下去, G G G D D D将在博弈中达到最优。

全局最优存在且函数收敛,在介绍完代码后证明

1.3 GAN代码

# GAN_2014.py
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras import Sequential,Model
from tensorflow.keras.layers import Dense,Reshape,Input,Flatten
from tensorflow.keras.layers import LeakyReLU,BatchNormalization
from tensorflow.keras.datasets import mnist
from tensorflow.keras.optimizers import Adam

class GAN():
	def __init__(self):
		self.latent_dim = 100
		self.img_rows = 28
		self.img_cols = 28
		self.channel  = 1
		self.img_shape = (self.img_rows,self.img_cols,self.channel)
		
		self.discrinator = self.build_discrinator()         # 构建
		optimizer = Adam(0.0002,0.5)
		self.discrinator.compile(loss='binary_crossentropy',
								 optimizer=optimizer,
								 metrics=['accuracy'])
		 
		self.generator = self.build_generator()             # generator就可以完成从noise到img的生成
		
		self.discrinator.trainable = False
		z = Input(shape=(self.latent_dim,))
		img = self.generator(z)
		validity = self.discrinator(img)

		self.combined = Model(z,validity)
		self.combined .compile(loss='binary_crossentropy',optimizer=optimizer)  # 完成了叠加模型的构建
		
		
		
	# 构建生成器模型
	def build_generator(self):
		model = Sequential()
		# 添加一层全连接层
		model.add(Dense(256, input_dim=self.latent_dim ))  # 输入噪声是一维含有100个元素的向量
		model.add(LeakyReLU(alpha=0.2))
		model.add(BatchNormalization(momentum=0.8))         # BN层
		model.add(Dense(512))
		model.add(LeakyReLU(alpha=0.2))
		model.add(BatchNormalization(momentum=0.8))         # BN层

		model.add(Dense(1024))
		model.add(LeakyReLU(alpha=0.2))
		model.add(BatchNormalization(momentum=0.8))         # BN层

		model.add(Dense(np.prod(self.img_shape),activation='tanh'))  # 神经元个数(输出)等于图像尺寸乘积 
		model.add(Reshape(self.img_shape))                 # reshape成图像形状 28*28*1
		model.summary()                                    # 记录各层参数情况
		
		noise = Input(shape=(self.latent_dim,))
		img = model(noise)
		
		return Model(noise,img)                            # 返回输入为噪声,输出为预测图的Model

	# 构建判别器模型
	
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SupV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值