基本介绍
今日要实践的模型是DCGAN,用于生成漫画头像,生成头像原理可参考GAN图像生成。使用的动漫头像数据集共有70,171张动漫头像图片,图片大小均为96*96。本文会先简单介绍DCGAN模型,然后展示自己的运行结果,不作代码展示,最后进行总结。
DCGAN模型简介
该部分内容来自官方文档,非原创
DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Adversarial Networks)是GAN的直接扩展。不同之处在于,DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。它最早由Radford等人在论文中进行描述。判别器由分层的卷积层、BatchNorm层和LeakyReLU激活层组成。输入是3x64x64的图像,输出是该图像为真图像的概率。生成器则是由转置卷积层、BatchNorm层和ReLU激活层组成。输入是标准正态分布中提取出的隐向量𝑧,输出是3x64x64的RGB图像
- 生成器
生成器G
的功能是将隐向量z
映射到数据空间。由于数据是图像,这一过程也会创建与真实图像大小相同的 RGB 图像。在实践场景中,该功能是通过一系列Conv2dTranspose
转置卷积层来完成的,每个层都与BatchNorm2d
层和ReLu
激活层配对,输出数据会经过tanh
函数,使其返回[-1,1]
的数据范围内。DCGAN论文生成图像如下所示:
- 判别器
判别器D
是一个二分类网络模型,输出判定该图像为真实图的概率。通过一系列的Conv2d
、BatchNorm2d
和LeakyReLU
层对其进行处理,最后通过Sigmoid
激活函数得到最终概率。DCGAN使用卷积而不是通过池化来进行下采样,这样可以让网络学习自己的池化特征
DCGAN代码实践
官方给的代码实践是经典的深度学习流程。即数据集预处理,模型搭建,模型训练,模型评估,模型推理,详细的可直接参考官方的代码实践,这里给出我自己的运行结果和部分代码
- 数据集部分可视化结果
- 模型训练超参数配置:使用的是二进制交叉熵损失函数BCELoss,设置了两个单独的优化器,一个用于
D
,另一个用于G
。这两个都是lr = 0.0002
和beta1 = 0.5
的Adam优化器。 - 模型训练结果:由于时间因素,只训练了3轮,效果很差,训练轮次太少导致实际推理得出的动漫图像是破损老化的图片一样。
- 描绘
D
和G
损失与训练迭代的关系图
- 模型推理结果:每训练一轮推理一次,然后将结果做成gif图,从下面的gif图可以看出,随着训练次数的增多,图像质量也越来越好。如果增大训练周期数,当
num_epochs
达到50(该数据来自官方文档)以上时,生成的动漫头像图片与数据集中的较为相似
总结
今天的DCGAN模型是GAN模型的一种优化,更改了模型的一些神经网络层,使其生成图像能力更好一些。今天的实践的理论方面不多,所以不是很难,训练运行后生成了动漫图像,虽然因为训练轮次原因,很糊,但也是别有一番风味。