目录
目录README.md

CGAN_jittor

项目开源地址:https://gitlink.org.cn/Men1scus/CGAN_jittor

摘要

本报告介绍了条件生成对抗网络(Conditional GAN, CGAN)的基本原理及其在Jittor框架下的实现过程。通过对比不同训练轮数下模型的生成效果,分析了在训练至第1000轮时生成质量下降的原因。实验结果表明,虽然CGAN能够在特定条件下生成高质量图像,但过度训练可能导致模型性能退化。

引言

自2014年生成对抗网络(Generative Adversarial Networks, GAN)被提出以来,它在生成模型领域取得了显著进展。GAN通过生成器(Generator)和判别器(Discriminator)之间的对抗训练,能够生成高质量且逼真的图像。条件生成对抗网络(Conditional GAN, CGAN)在传统GAN的基础上引入了条件变量,使生成过程能够受到特定条件的控制,从而生成符合特定要求的图像。本实验基于Jittor框架实现了CGAN,并通过不同训练轮数的对比,分析了生成效果的变化及其背后的原因。

生成对抗网络(GAN)原理

生成对抗网络(GAN)由生成器和判别器两个部分组成。生成器的任务是从噪声分布中生成逼真的数据样本,试图“欺骗”判别器;而判别器的任务则是区分真实数据与生成的数据,提升自身的辨别能力。二者通过对抗训练共同进化,最终生成器能够生成难以区分的高质量数据。

GAN的训练目标函数如下:

minGmaxDExpdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]\min_G \max_D \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]

其中,$G$表示生成器,$D$表示判别器,$p_{data}(x)$是真实数据分布,$p_z(z)$是噪声分布。

GAN结构示意图

条件生成对抗网络(Conditional GAN)原理

条件生成对抗网络(CGAN)在传统GAN的基础上加入了条件变量,使生成过程可以受到特定信息的约束,生成符合特定条件的样本。条件变量可以是类别标签、文本描述等。

在CGAN中,生成器和判别器不仅接收噪声向量$z$,还接收条件变量$y$。其训练目标函数调整为:

minGmaxDExpdata(x)[logD(xy)]+Ezpz(z)[log(1D(G(zy)y))]\min_G \max_D \mathbb{E}_{x \sim p_{data}(x)}[\log D(x|y)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z|y)|y))]

引入条件变量后,CGAN能够根据输入的条件生成符合要求的图像,例如输入特定的类别标签,生成器能够生成对应类别的图像。

Conditional GAN结构示意图

实验设置

环境配置与安装

本实验基于Jittor框架实现CGAN,具体的环境配置步骤如下:

  1. 安装必要依赖参考这篇文章进行环境配置。关键步骤包括:

    conda install -c conda-forge gxx=8 mpich
  2. 检查环境配置是否成功通过以下命令运行Jittor的测试示例:

    python -m jittor.test.test_example

    成功配置的终端输出示例如下:

    配置成功

    测试结果

模型架构与训练方法

本实验采用标准的CGAN架构,包括生成器和判别器两个部分。生成器接收噪声向量和条件变量,输出生成的图像;判别器接收真实图像或生成图像及其对应的条件变量,输出判别结果。

训练过程中,采用交替优化策略,先优化判别器,再优化生成器。损失函数采用交叉熵损失,以促进生成器生成更逼真的图像,同时提升判别器的辨别能力。

实验结果

训练过程

本实验在100轮和1000轮下分别进行了训练,记录了训练过程中判别器损失(D loss)和生成器损失(G loss)的变化情况。

训练日志(Epoch 999/1000部分)

[Epoch 999/1000] [Batch 500/938] [D loss: 0.000887] [G loss: 0.975803]
[Epoch 999/1000] [Batch 550/938] [D loss: 0.002481] [G loss: 0.973012]
[Epoch 999/1000] [Batch 600/938] [D loss: 0.007534] [G loss: 0.949981]
[Epoch 999/1000] [Batch 650/938] [D loss: 0.003770] [G loss: 0.943704]
[Epoch 999/1000] [Batch 700/938] [D loss: 0.012006] [G loss: 0.927371]
[Epoch 999/1000] [Batch 750/938] [D loss: 0.014264] [G loss: 0.956230]
[Epoch 999/1000] [Batch 800/938] [D loss: 0.015791] [G loss: 0.919918]
[Epoch 999/1000] [Batch 850/938] [D loss: 0.008943] [G loss: 0.989735]
[Epoch 999/1000] [Batch 900/938] [D loss: 0.007646] [G loss: 0.967279]

生成结果

在不同训练轮数下,生成器生成的图像质量存在明显差异。

Epoch = 100

Epoch 100 生成结果

在100轮训练后,生成器能够生成较为清晰和逼真的图像,展示了模型的初步学习效果。

Epoch = 1000

Epoch 1000 生成结果

然而,训练至1000轮后,生成的图像质量明显下降,细节模糊,结构混乱。

分析与讨论

训练日志分析

通过分析Epoch 999/1000的训练日志,可以看出判别器的损失值(D loss)整体较低,而生成器的损失值(G loss)在不同批次间波动较大。这表明在训练的最后阶段,判别器对真实数据和生成数据的区分能力较强,而生成器在努力提升其生成能力。

生成质量分析:Epoch=1000时效果较差的原因

尽管通常认为训练轮数越多,模型的生成能力越强,但在本实验中,训练至1000轮时生成质量反而下降,可能原因包括:

  1. 过拟合(Overfitting)经过长时间训练,生成器可能过度拟合训练数据,导致生成的图像缺乏多样性,出现模式崩溃(Mode Collapse)的现象,从而影响生成质量。
  2. 学习率调整不当随着训练的进行,如果没有合理调整学习率,生成器和判别器可能陷入局部最优,导致训练不稳定,影响生成效果。
  3. 判别器过强 在长时间训练过程中,判别器的辨别能力可能过强,生成器难以继续提升,从而导致生成质量停滞甚至下降。

针对上述问题,可以考虑以下改进措施:

  • 引入正则化技术,如谱归一化(Spectral Normalization),以稳定训练过程。
  • 调整学习率策略,采用学习率衰减或自适应优化算法,如Adam优化器。
  • 采用更复杂的模型架构,例如引入残差网络(ResNet)或注意力机制(Attention Mechanism)。
  • 增加训练数据量,确保数据的多样性和充分性。
  • 监控训练过程,及时调整模型参数,避免过拟合和模式崩溃。

结论

本实验在Jittor框架下成功实现了条件生成对抗网络(CGAN),并通过不同训练轮数的对比,观察了生成效果的变化。尽管在初期训练阶段,生成器能够生成较为清晰的图像,但经过1000轮训练后,生成质量出现下降,主要原因可能是过拟合、判别器过强以及学习率等训练参数未能合理调整。未来的工作将致力于优化模型架构和训练策略,以提升CGAN的生成性能和稳定性。

参考文献

  • Mirza, Mehdi, Simon Osindero. “Conditional generative adversarial nets.” arXiv preprint arXiv:1411.1784 (2014).
关于

A Jittor implementation of Conditional GAN (CGAN).

1.3 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号