一、GAN 基础原理
DCGAN(深度卷积对抗生成网络
,Deep Convolutional Generative Adversarial Networks)是GAN的直接扩展。不同之处在于,DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。
它最早由Radford等人在论文Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks中进行描述。判别器
由分层的卷积层
、BatchNorm层
和LeakyReLU激活层
组成。输入是3x64x64的图像,输出是该图像为真图像的概率。生成器
则是由转置卷积层
、BatchNorm层
和ReLU激活层
组成。输入是标准正态分布中提取出的隐向量z
,输出是3x64x64的RGB图像。
二、DCGAN 原理
- 简介
- 深度卷积对抗生成网络,是 GAN 的扩展。
- 判别器由卷积、BatchNorm 层和 LeakyReLU 激活层组成,输入图像,输出图像为真的概率。
- 生成器由转置卷积、BatchNorm 层和 ReLU 激活层组成,输入隐向量,输出 RGB 图像。
- 论文
- 最早由 Radford 等人在论文
Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks
中描述。
- 最早由 Radford 等人在论文
三、数据准备与处理
- 数据下载与解压
- 使用
download
库的download
函数下载动漫头像数据集并解压。 - 函数:
download(url, path, kind, replace)
- 参数:
url
:数据集的下载链接。path
:保存数据集的路径。kind
:数据的类型,如zip
。replace
:是否替换已存在的文件。
- 示例:
download("https://download.mindspore.cn/dataset/Faces/faces.zip", "./faces", kind="zip", replace=True)
- 使用
- 数据处理
- 定义输入参数:
batch_size = 128
:批量大小。image_size = 64
:训练图像空间大小。nc = 3
:图像彩色通道数。nz = 100
:隐向量的长度。ngf = 64
:特征图在生成器中的大小。ndf = 64
:特征图在判别器中的大小。num_epochs = 10
:训练周期数。lr = 0.0002
:学习率。beta1 = 0.5
:Adam 优化器的beta1
超参数。
create_dataset_imagenet
函数:- 功能:对数据进行加载、增强和批量处理。
- 参数:
dataset_path
,数据集的路径。 - 示例:
create_dataset_imagenet('./faces')
- 内部使用
mindspore.dataset
中的模块进行操作:ImageFolderDataset
:加载数据集。- 各种数据变换操作,如
Resize
、CenterCrop
等。
- 数据可视化:
- 使用
create_dict_iterator
将数据转换为字典迭代器。 - 通过
plot_data
函数和matplotlib.pyplot
可视化部分训练数据。
- 使用
- 定义输入参数:
四、构造网络
- 生成器
- 功能:将隐向量映射到数据空间,生成 RGB 图像。
- 结构:由一系列
Conv2dTranspose
转置卷积层、BatchNorm2d
层和ReLU
激活层组成,输出经过tanh
函数。 - 代码实现:使用
mindspore
中的模块定义Generator
类。 - 函数:
Generator
类的__init__
和construct
方法。 - 参数:无。
- 示例:
generator = Generator()
- 判别器
- 功能:二分类网络,输出图像为真实图的概率。
- 结构:由一系列
Conv2d
、BatchNorm2d
和LeakyReLU
层组成,最后通过Sigmoid
激活函数。 - 代码实现:使用
mindspore
中的模块定义Discriminator
类。 - 函数:
Discriminator
类的__init__
和construct
方法。 - 参数:无。
- 示例:
discriminator = Discriminator()
五、模型训练
- 损失函数
- 使用
BCELoss
作为损失函数。 - 函数:
nn.BCELoss(reduction='mean')
- 参数:
reduction
,指定损失的归约方式,如'mean'
计算平均值。 - 示例:
adversarial_loss = nn.BCELoss(reduction='mean')
- 使用
- 优化器
- 为生成器和判别器分别设置
Adam
优化器,学习率lr = 0.0002
,beta1 = 0.5
。 - 函数:
nn.Adam(params, learning_rate, beta1)
- 参数:
params
:可训练的参数。learning_rate
:学习率。beta1
:Adam 优化器的超参数。
- 示例:
optimizer_D = nn.Adam(discriminator.trainable_params(), learning_rate=lr, beta1=beta1)
optimizer_G = nn.Adam(generator.trainable_params(), learning_rate=lr, beta1=beta1)
- 为生成器和判别器分别设置
- 训练模型
- 分为训练判别器和训练生成器两部分。
- 训练判别器:最大化
logD(x) + log(1 - D(G(z)))
的值,提高判别图像真伪的概率。 - 训练生成器:最小化
log(1 - D(G(z)))
,产生更好的虚假图像。
- 训练判别器:最大化
- 实现逻辑:
generator_forward
函数:计算生成器的损失和生成的图像。discriminator_forward
函数:计算判别器的损失。grad_generator_fn
和grad_discriminator_fn
:计算梯度。train_step
函数:执行训练步骤,更新参数。
- 训练过程:
- 循环训练网络,每 50 次迭代收集损失。
- 每个 epoch 结束后,生成一组图片并保存模型参数。
- 分为训练判别器和训练生成器两部分。
六、结果展示
- 绘制损失函数图像:展示判别器和生成器损失与训练迭代的关系。
- 生成动画:可视化训练过程中生成的图像。
- 加载模型生成图像:通过加载生成器网络模型参数文件生成新的图像。
七、调用的库及功能
download
:用于数据集的下载和解压。mindspore.dataset
:ImageFolderDataset
:加载数据集。shuffle
、num_parallel_workers
等:数据处理相关设置。- 各种数据变换操作,如
Resize
、CenterCrop
等。
mindspore
:- 构建神经网络,如
Conv2dTranspose
、BatchNorm2d
等。 - 定义损失函数和优化器。
- 执行梯度计算和参数更新。
- 构建神经网络,如
matplotlib.pyplot
:数据可视化,绘制损失曲线和图像。matplotlib.animation
:生成动画展示训练过程中的图像变化。
八、操作流程
- 准备数据:
- 下载数据集:使用
download
函数下载数据。 - 处理数据:调用
create_dataset_imagenet
函数进行加载、增强和批量处理。 - 可视化数据:使用
plot_data
函数展示部分数据。
- 下载数据集:使用
- 构建网络:
- 定义生成器
Generator
类。 - 定义判别器
Discriminator
类。 - 实例化生成器和判别器。
- 定义生成器
- 训练模型:
- 定义损失函数。
- 设置优化器。
- 执行训练逻辑,循环更新参数,保存模型。
- 结果展示:
- 绘制损失曲线。
- 生成动画展示生成图像的变化。
- 加载模型生成新图像。