昇思Mindspore25天学习打卡Day20:DCGAN生成漫画头像
在下面的教程中,我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中,使用的动漫头像数据集共有70,171张动漫头像图片,图片大小均为96*96.
1 GAN基础原理
这部分原理介绍参考Link:GAN图像生成
2 DCGAN原理
DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Adversarial Networks)是GAN的直接扩展。不同之处在于,DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。
它最早由Radford等人在论文Link:Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks中进行描述。判别器由分层的卷积层、BatchNorm层和LeakReLU激活层组成。输入是3x64x64的图像,输出是该图像为真图像的概率。生成器则是由转置卷积层、BatchNorm层和ReLU激活层组成。输入是标准正态分布中提取出的隐向量z,输出是3x64x64的RGB图像。
本教程将使用动漫头像数据集来训练一个生成式对抗网络,接着使用该网络生成动漫头像图片。
3 数据准备与处理
首先我们将数据集下载到指定目录下并解压。示例代码如下:
数据处理
定义 create_dataset_imagenet 函数对数据进行处理和增强操作.
通过 create dict iterator 函数将数据转换成字典迭代器,然后使用 matplotlib 模块可视化部分训练数据。
4 构造网络
当处理完数据后,就可以来进行网络的搭建了。按照DCGAN论文中的描述,所有模型权重均应从 mean为0,sigma为0.02的正态分布中随机初始化。
4.1 生成器
生成器 G的功能是将隐向量z 映射到数据空间。由于数据是图像,这一过程也会创建与真实图像大小相同的 RG8 图像。在实践场景中,该功能是通过一系列
Conv2dTranspose 转置卷积层来完成的,每个层都与 BatchNorm2d 层和 ReLu 激活层配对,输出数据会经过 tanh 函数,使其返回[-1,1]的数据范围内。
DCGAN论文生成图像如下所示:
- 图片来源: Liuk:Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks
我们通过输入部分中设置的 nz、ngf 和 nc 来影响代码中的生成器结构。 nz 是隐向量 z的长度,
ngf 与通过生成器传播的特征图的大小有关,nc 是输出图像中的通道数。
以下是生成器的代码实现:
4.2 判别器
如前所述,判别器D是一个二分类网络模型,输出判定该图像为真实图的概率。通过一系列的 conv2d、
BatchNorm2d 和 LeakyReLu 层对其进行处理,最后通过 Sigmoid 激活函数得到最终概率。
DCGAN论文提到,使用卷积而不是通过池化来进行下采样是一个好方法,因为它可以让网络学习自己的池化特征。
判别器的代码实现如下:
5 模型训练
损失函数
当定义了 D和G后,接下来将使用Mindspore中定义的二进制交叉熵损失函数Link:BCELoss
优化器
这里设置了两个单独的优化器,一个用于D,另一个用于G。这两个都是 1r=0.8002 和 beta1 = 0.5 的Adam优化器。
训练模型
训练分为两个主要部分:训练判别器和训练生成器.
- 训练判别器
训练判别器的目的是最大程度地提高判别图像真伪的概率。按照Goodfelow的方法,是希望通过提高其随机梯度来更新判别器,所以我们要最大化
l o g D ( x ) + l o g ( 1 − D ( G ( z ) ) logD(x)+log(1-D(G(z)) logD(x)+log(1−D(G(z))的值, - 训练生成器
如DCGAN论文所述,我们希望通过最小化 l o g ( 1 − D ( G ( z ) ) ) log(1- D(G(z))) log(1−D(G(z)))来训练生成器,以产生更好的虚假图像,。
在这两个部分中,分别获取训练过程中的损失,并在每个周期结束时进行统计,将 fixed_noise 批量推送到生成器中,以直观地跟踪 G的训练进度.
下面实现模型训练正向逻辑:
循环训练网络,每经过50次迭代,就收集生成器和判别器的损失,以便于后面绘制训练过程中损失函数的图像。
6 结果展示
运行下面代码,描绘 D和G损失与训练迭代的关系图
可视化训练过程中通过隐向量 fixed noise 生成的图像。
从上面的图像可以看出,随着训练次数的增多,图像质量也越来越好。如果增大训练周期数,当 num_epochs 达到50以上时,生成的动漫头像图片与数据集中的较为相似,下面我们通过加载生成器网络模型参数文件来生成图像,代码如下: