从VAE到Diffusion生成模型详解(2.1):普通GAN的改进及变种
**从VAE到Diffusion生成模型详解**
**2.1 普通GAN的改进及变种**
在上一篇文章中,我们讨论了VAE(变分自编码器)和Diffusion生成模型。然而,普通GAN(对抗性生成网络)仍然是生成模型领域的一块基石。虽然它相对于VAE和Diffusion来说较为简单,但其改进和变种却有很多值得一提的内容。
**2.1.1 普通GAN**
首先,我们来回顾一下普通GAN的基本结构:
* **Generator(G)**:生成器是网络中负责生成假样本的部分。它通常由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器是网络中负责区分真实数据和假样本的部分。它也通常由多个卷积层和激活函数组成。
普通GAN的训练过程如下:
1. 首先,生成器生成一批假样本。
2. 然后,将这些假样本与真实数据一起输入判别器。
3. 判别器输出一个概率值,表示假样本是否为真实数据。
4. 最后,根据判别器的输出结果,调整生成器和判别器的参数,以使得生成器能够生成更逼真的假样本。
**2.1.2 DCGAN**
DCGAN(Deep Convolutional GAN)是普通GAN的一个变种。它在普通GAN的基础上增加了多个卷积层和激活函数,提高了网络的深度和能力。
DCGAN的结构如下:
* **Generator(G)**:生成器由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器也由多个卷积层和激活函数组成。
DCGAN的训练过程与普通GAN类似,但由于其网络结构更复杂,因此需要更多的计算资源和时间。
**2.1.3 WGAN**
WGAN( Wasserstein GAN)是普通GAN的一个变种。它在普通GAN的基础上引入了Wasserstein距离,提高了判别器的能力。
WGAN的结构如下:
* **Generator(G)**:生成器由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器也由多个卷积层和激活函数组成。
WGAN的训练过程如下:
1. 首先,生成器生成一批假样本。
2. 然后,将这些假样本与真实数据一起输入判别器。
3. 判别器输出一个概率值,表示假样本是否为真实数据。
4. 最后,根据判别器的输出结果,调整生成器和判别器的参数,以使得生成器能够生成更逼真的假样本。
**2.1.4 CycleGAN**
CycleGAN(Cycle-Consistent GAN)是普通GAN的一个变种。它在普通GAN的基础上引入了周期一致性约束,提高了生成器的能力。
CycleGAN的结构如下:
* **Generator(G)**:生成器由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器也由多个卷积层和激活函数组成。
CycleGAN的训练过程如下:
1. 首先,生成器生成一批假样本。
2. 然后,将这些假样本与真实数据一起输入判别器。
3. 判别器输出一个概率值,表示假样本是否为真实数据。
4. 最后,根据判别器的输出结果,调整生成器和判别器的参数,以使得生成器能够生成更逼真的假样本。
**2.1.5 Pix2Pix**
Pix2Pix(Pixel-to-Pixel GAN)是普通GAN的一个变种。它在普通GAN的基础上引入了像素对齐约束,提高了生成器的能力。
Pix2Pix的结构如下:
* **Generator(G)**:生成器由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器也由多个卷积层和激活函数组成。
Pix2Pix的训练过程如下:
1. 首先,生成器生成一批假样本。
2. 然后,将这些假样本与真实数据一起输入判别器。
3. 判别器输出一个概率值,表示假样本是否为真实数据。
4. 最后,根据判别器的输出结果,调整生成器和判别器的参数,以使得生成器能够生成更逼真的假样本。
**2.1.6 StarGAN**
StarGAN(Stargan GAN)是普通GAN的一个变种。它在普通GAN的基础上引入了多个任务约束,提高了生成器的能力。
StarGAN的结构如下:
* **Generator(G)**:生成器由多个卷积层和激活函数组成,最后输出一个与真实数据相同维度的向量。
* **Discriminator(D)**: 判别器也由多个卷积层和激活函数组成。
StarGAN的训练过程如下:
1. 首先,生成器生成一批假样本。
2. 然后,将这些假样本与真实数据一起输入判别器。
3. 判别器输出一个概率值,表示假样本是否为真实数据。
4. 最后,根据判别器的输出结果,调整生成器和判别器的参数,以使得生成器能够生成更逼真的假样本。
**2.1.7 总结**
在本节中,我们讨论了普通GAN及其变种。这些变种通过引入新的约束和任务提高了生成器的能力,例如周期一致性、像素对齐和多个任务等。这些变种可以应用于不同的领域,如图像到图像转换、图像合成等。
**2.1.8代码示例**
以下是普通GAN及其变种的代码示例:
import torchimport torch.nn as nnclass Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.fc1 = nn.Linear(100,128) self.relu1 = nn.ReLU() self.fc2 = nn.Linear(128,256) self.relu2 = nn.ReLU() self.fc3 = nn.Linear(256,512) self.relu3 = nn.ReLU() self.fc4 = nn.Linear(512,784) def forward(self, x): out = self.relu1(self.fc1(x)) out = self.relu2(self.fc2(out)) out = self.relu3(self.fc3(out)) out = torch.sigmoid(self.fc4(out)) return outclass Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.fc1 = nn.Linear(784,512) self.leaky_relu1 = nn.LeakyReLU() self.fc2 = nn.Linear(512,256) self.leaky_relu2 = nn.LeakyReLU() self.fc3 = nn.Linear(256,128) self.leaky_relu3 = nn.LeakyReLU() self.fc4 = nn.Linear(128,1) def forward(self, x): out = self.leaky_relu1(self.fc1(x)) out = self.leaky_relu2(self.fc2(out)) out = self.leaky_relu3(self.fc3(out)) out = torch.sigmoid(self.fc4(out)) return out# WGANclass GeneratorWGAN(nn.Module): def __init__(self): super(GeneratorWGAN, self).__init__() self.fc1 = nn.Linear(100,128) self.relu1 = nn.ReLU() self.fc2 = nn.Linear(128,256) self.relu2 = nn.ReLU() self.fc3 = nn.Linear(256,512) self.relu3 = nn.ReLU() self.fc4 = nn.Linear(512,784) def forward(self, x): out = self.relu1(self.fc1(x)) out = self.relu2(self.fc2(out)) out = self.relu3(self.fc3(out)) out = torch.sigmoid(self.fc4(out)) return outclass DiscriminatorWGAN(nn.Module): def __init__(self): super(DiscriminatorW