1. 简介
DCGAN是将CNN与GAN的一种结合,这是第一次在GAN中使用卷积神经网络并取得了非常好的结果,弥合CNN在监督学习和无监督学习之间的差距,其将卷积网络引入到生成式模型当中来做无监督的训练,利用卷积网络强大的特征提取能力来提高生成网络的学习效果。
2. 代码概述
这段代码主要包括以下几个关键部分:
2.1 Generator(生成器)
生成器负责生成图像,它包括反卷积层和批量归一化层。生成器的目标是生成逼真的手写数字图像。
生成器的架构如下:
- 输入层:100维的随机噪声向量
- 反卷积层1:将输入向量转换为256x7x7的特征图
- 反卷积层2:将通道数减半,输出128x14x14的特征图
- 反卷积层3:将通道数再次减半,输出64x28x28的特征图
- 反卷积层4:将通道数再次减半,输出1x28x28的特征图
- 输出层:通过Tanh激活函数将特征图映射到[-1, 1]的范围内输入经过每个反卷积层后,会进行 ReLU 激活函数,最后一层使用 tanh 激活函数将输出限制在 (-1, 1) 的范围内。整体结构的目标是将输入的随机噪声逐渐转化为逼真的图像。
2.2 Discriminator(鉴别器)
鉴别器负责对图像进行分类,判断图像是真实的还是生成的。它包括卷积层和批量归一化层。
鉴别器的架构如下:
- 输入层:1x28x28的图像
- 卷积层1:输出128x14x14的特征图,使用Leaky ReLU激活函数
- 卷积层2:输出256x7x7的特征图,使用Leaky ReLU激活函数
- 卷积层3:输出512x3x3的特征图,使用Leaky ReLU激活函数
- 卷积层4:输出1024x1x1的特征图,使用Leaky ReLU激活函数
- 输出层:单一节点,通过Sigmoid激活函数输出鉴别结果(真实或伪造)
每个卷积层后都使用了带有 Leaky ReLU 激活函数的层,该函数有助于鉴别器学习特征。最后一层使用 sigmoid 激活函数,将输出映射到0到1的范围,用于二元分类(真实或假)。
2.3 训练过程
训练过程中,生成器和鉴别器交替训练。生成器试图生成逼真的图像,以愚弄鉴别器,而鉴别器试图准确分类真实图像和生成图像。
3. 实验步骤
3.1 数据预处理
在这一步中,我们加载MNIST数据集并进行以下预处理步骤:
- 图像尺寸调整到64x64像素
- 归一化:将像素值从[0, 255]缩放到[-1, 1]范围
3.2 网络构建
- 创建生成器(Generator)和鉴别器(Discriminator)网络结构。
- 初始化网络权重和偏差。
3.3 损失函数和优化器
- 使用二元交叉熵(BCE)损失函数来评估生成器和鉴别器的性能。
- 使用Adam优化器来更新生成器和鉴别器的权重。设置β1为0.5和β2为0.999。
3.4 训练DCGAN
- 定义训练循环,交替训练生成器和鉴别器。
- 训练迭代数:20个epoch
- 每个epoch中的步骤:
- 训练鉴别器:通过向鉴别器提供真实图像和生成图像,计算并更新鉴别器的损失。
- 训练生成器:通过向生成器提供噪声,生成图像并计算并更新生成器的损失。
4. 结果分析
4.1 损失曲线
在训练过程中,损失曲线如下图所示。横轴表示训练迭代次数,纵轴表示损失值。
GAN损失曲线
我们可以看到,生成器(绿色曲线)的损失逐渐下降,而鉴别器(蓝色曲线)的损失也在下降,这表明GAN在训练过程中逐渐收敛。
4.2 生成图像展示
以下是训练过程中生成的手写数字图像示例:
- 使用固定噪声生成 (fixed_z_)
DCGAN |
- MNIST 与生成的图像
MNIST |
GAN after 100 epochs |
DCGAN after 20 epochs |
4.3 性能分析
生成的图像在视觉上是逼真的,它们展示了手写数字的特征。这说明DCGAN成功地生成了类似于MNIST数据集中的手写数字的图像。
5. 总结
本实验中,我们成功地使用DCGAN生成了手写数字图像。实验结果表明,GAN在生成逼真图像方面具有潜力,尽管仍有改进的空间。