参考:https://blog.csdn.net/weixin_44791964/article/details/103744620
b站视频:https://www.bilibili.com/video/BV13J41187Fo
学习前言
什么是CGAN
CGAN一种带条件约束的GAN,在生成模型(D)和判别模型(G)的建模中均引入条件变量y(conditional variable y)。(如:想生成0即生成0,想要1就是1)
使用额外信息y对模型增加条件,可以指导数据生成过程。这些条件变量y可以基于多种信息,例如类别标签,用于图像修复的部分数据,来自不同模态(modality)的数据。
如果条件变量y是类别标签,可以看做CGAN是把纯无监督的 GAN 变成有监督的模型的一种改进。
这个简单直接的改进被证明非常有效。
简单来讲,普通的GAN输入的是一个N维的正态分布随机数,而CGAN会为这个随机数添上标签,其利用Embedding层将正整数(索引值)转换为固定尺寸的稠密向量,并将这个稠密向量与N维的正态分布随机数相乘,从而获得一个有标签的随机数。
神经网络构建
1、Generator
生成网络的输入是一个带标签的随机数,具体操作方式是生成一个N维的正态分布随机数,再利用Embedding层将正整数(索引值)转换为N维的稠密向量,并将这个稠密向量与N维的正态分布随机数相乘。
def build_generator(self):
model = Sequential()
model.add(Dense(256, input_dim=self.latent_dim))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(512))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(np.prod(self.img_shape), activation='tanh'))
model.add(Reshape(self.img_shape))
# 输入一个数字,将其转换为固定尺寸的稠密向量
# 输出维度是self.latent_dim
label = Input(shape=(1,), dtype='int32')
label_embedding = Flatten()(Embedding(self.num_classes, self.latent_dim)(label))
# 将正态分布和索引对应的稠密向量相乘
noise = Input(shape=(self.latent_dim,))
model_input = multiply([noise, label_embedding])
img = model(model_input)
return Model([noise, label], img)
2、Discriminator
普通GAN的判别模型的目的是根据输入的图片判断