2024年夏季《深度学习》学习报告

本实验属于哪门课程中国海洋大学24夏《深度学习》
学习内容生成式对抗网络 & Diffussion

一、学习目标

1、理解并掌握 GAN、CGAN、DCGAN 的基本概念与 PyTorch 代码实现;2、从基础出发,了解 Diffusion 模型的工作原理及其应用前沿;3、理解王贯安的 GAN 代码,提升对生成式对抗网络的理解与调试能力。

二、学习内容

2.1、视频学习

2.1.1 生成式对抗网络

2.1.1.1 了解GAN,CGAN,DCGAN,WGAN
生成对抗网络(GAN)

生成对抗网络(Generative Adversarial Networks,GAN)由Ian Goodfellow等人在2014年提出,开创了一种新的生成模型框架。GAN的设计基于博弈论,由两个神经网络组成:生成器(Generator)和判别器(Discriminator)。

1. 架构
  • 生成器(G)

    • 输入:随机噪声向量z通常来自于均匀分布或高斯分布。

    • 输出:生成的假数据G(z)。

    • 网络结构:生成器可以是多层的全连接网络或卷积网络,其目标是通过反向传播学习到从随机噪声到真实数据分布的映射。

  • 判别器(D)

    • 输入:真实数据x和生成的数据G(z)。

    • 输出:一个标量值,表示输入数据是来自真实分布还是生成分布的概率。

    • 网络结构:通常使用卷积神经网络(CNN)来处理高维数据(如图像),以提高判别性能。

2. 训练过程
  • 对抗训练:GAN的训练过程是一个动态的对抗博弈,包含两个阶段:

    • 判别器训练:最大化判别器的损失L_D,目标是正确识别真实样本和生成样本。

    • 生成器训练:最小化生成器的损失L_G,目的是让生成的样本通过判别器。

  • 收敛性:理论上,GAN的训练会收敛到纳什均衡,但在实际应用中,GAN的训练过程通常不稳定,容易出现模式崩溃(mode collapse)现象。

3. 应用实例
  • 图像生成:如人脸生成(StyleGAN)、图像超分辨率重建(SRGAN)。

  • 图像修复:生成缺失部分的图像。

  • 数据增强:为机器学习模型生成额外的训练数据。

条件生成对抗网络(CGAN)

条件生成对抗网络(Conditional GAN,CGAN)是GAN的一种扩展,它允许在生成过程中引入额外的条件信息,以实现更有控制的生成过程。

1. 架构改进
  • 条件输入

    • 在生成器和判别器中都引入条件变量c(如类别标签、图像特征等)。

    • 生成器的输入变为(z, c),判别器的输入变为(x, c)。

  • 网络结构

    • 生成器根据条件信息生成特定类型的样本。

    • 判别器结合条件信息评估样本的真实性。

2. 训练过程
  • 损失函数:与GAN类似,但需要将条件信息引入损失函数。

3. 应用实例
  • 图像生成:根据指定的类别生成图像,如手写数字生成(MNIST)。

  • 图像到图像转换:如将素描转换为真实图像,或将夜间场景转换为白天场景(pix2pix)。

  • 语音生成:生成与特定条件(如情感、语速)相匹配的语音。

深度卷积生成对抗网络(DCGAN)

深度卷积生成对抗网络(Deep Convolutional GAN,DCGAN)结合了卷积神经网络的优势,使得GAN能够更有效地处理高维数据,特别是图像。

1. 架构特点
  • 生成器

    • 使用反卷积层(转置卷积)逐步上采样随机噪声,生成高分辨率图像。

    • 通常采用批归一化(Batch Normalization)和ReLU激活函数以提高训练稳定性。

  • 判别器

    • 使用卷积层逐步降采样输入图像,输出真实与伪造的概率。

    • 使用Leaky ReLU激活函数,以缓解梯度消失问题。

2. 训练过程
  • 训练技巧

    • DCGAN通常采用Adam优化器进行优化,学习率和β参数需要精心设置。

    • 通过定期更新生成器和判别器以确保训练过程的平衡。

3. 应用实例
  • 高质量图像生成:广泛应用于生成高清图像,如艺术图像、风景图像等。

  • 视频生成:生成短视频片段,结合时间维度的生成。

  • 图像转化:如风格迁移和图像修复等任务。

Wasserstein生成对抗网络(WGAN)

Wasserstein生成对抗网络(Wasserstein GAN,WGAN)引入了Wasserstein距离,改善了传统GAN的训练稳定性和生成质量。

1. 关键改进
  • Wasserstein距离:通过测量生成样本分布与真实样本分布之间的“移动成本”,提供了更平滑的损失函数。

  • 判别器作为Critic:在WGAN中,判别器的输出为实数而不是概率,其目标是估计样本分布之间的距离。

2. 训练技巧
  • 1-Lipschitz约束:为确保Wasserstein距离的有效性,判别器的参数需要进行裁剪,或使用权重约束。

  • 多次判别器更新:在更新生成器之前,通常需要对判别器进行多次更新,以增强训练的稳定性。

3. 应用实例
  • 高维数据生成:WGAN在生成高维数据(如图像和视频)方面表现优异,能生成更为平滑且多样的样本。

  • 艺术图像生成:在艺术创作中使用WGAN生成各种风格的艺术作品。

生成对抗网络(GAN)及其变种(CGAN、DCGAN和WGAN)在计算机视觉、自然语言处理和生成模型等多个领域取得了重要进展。随着这些技术的不断演进,GAN不仅提高了生成数据的质量和多样性,还开辟了新的应用领域,如图像增强、风格迁移和语音生成。未来,GAN技术的进一步发展有望实现更高水平的智能生成,推动各类人工智能应用的进步。

2.1.1.2 了解生成对抗网络GAN前沿与实战

生成对抗网络(GAN,Generative Adversarial Networks)自2014年由Ian Goodfellow提出以来,迅速成为深度学习领域的热门话题。GAN的核心思想是通过两个神经网络——生成器(Generator)和判别器(Discriminator)——在博弈过程中相互提升,从而生成逼真的数据。

GAN的工作原理
  • 生成器(Generator):输入是随机噪声,通过网络生成数据样本(如图片),目的是生成足够逼真的样本来欺骗判别器。

  • 判别器(Discriminator):输入是生成样本和真实样本,它的任务是区分这些样本,判断它们是真实的还是由生成器生成的。

两者通过对抗博弈进行训练:生成器的目标是生成越来越真实的样本,而判别器则试图提高自己区分真伪的能力,直到生成器生成的样本与真实数据难以区分。

GAN的前沿研究

随着GAN的发展,许多新的变种和改进模型应运而生。这些模型解决了GAN训练不稳定、生成样本质量不足等问题,推动了其在图像、文本生成等领域的应用。

  1. Wasserstein GAN(WGAN):WGAN通过引入Wasserstein距离,改进了传统GAN的损失函数,解决了生成器和判别器训练时的不稳定问题。WGAN提供了更稳定的训练,且可以用生成样本的质量来衡量网络的改进。

  2. DCGAN(Deep Convolutional GAN):DCGAN将卷积神经网络(CNN)引入到GAN中,使其在图像生成任务上取得了显著的进展。DCGAN采用全卷积网络架构,提升了生成图像的质量与清晰度。

  3. CycleGAN:该模型允许在没有成对数据的情况下进行图像到图像的转换。CycleGAN通过引入“循环一致性损失”来确保图像风格的转移保持一致性,例如从马的图片转化为斑马的图片。

  4. StyleGAN:StyleGAN特别擅长生成高分辨率的图像,并允许用户控制生成图像的风格。它通过引入风格控制机制,使得生成图像可以在不同风格之间无缝切换。

  5. BigGAN:BigGAN通过扩大网络规模和数据规模,在生成高分辨率图像时表现出色。其关键是利用更大的模型和数据集来生成更逼真的图像,但同时也面临更高的计算开销。

GAN的实战应用

GAN在多个领域取得了广泛的应用,以下是一些典型的实战案例:

  1. 图像生成:GAN被广泛用于生成高质量的图像,比如艺术品创作、头像生成、3D物体建模等。StyleGAN尤其在生成逼真人物肖像方面效果显著。

  2. 图像超分辨率:利用GAN可以将低分辨率的图像生成高分辨率的版本,如Super-Resolution GAN(SRGAN)能够从模糊的低分辨率图片生成清晰的高分辨率图片,应用在医学影像和卫星图像分析等领域。

  3. 数据增强:在训练数据不足的情况下,GAN可以生成额外的训练样本以丰富数据集,这在医学图像处理或少样本学习中非常有用。

  4. 文本生成和翻译:GAN也被用于自然语言处理(NLP)中的文本生成与翻译,虽然图像生成更为常见,但文本领域的GAN研究也在不断推进,例如SeqGAN在文本生成任务中的应用。

  5. 图像到图像的转换:如使用Pix2Pix或CycleGAN实现风格迁移任务,如将照片风格化成绘画,或者实现不同种类图片之间的转化。

GAN的挑战与未来发展
  1. 训练不稳定:GAN的训练过程往往不稳定,容易出现模式崩溃(Mode Collapse)的问题,即生成器仅能生成一小部分有限的样本。针对这种情况,研究者提出了如WGAN、谱归一化(Spectral Normalization)等方法,试图缓解这一问题。

  2. 生成质量:虽然GAN生成的图像质量已经显著提高,但在生成复杂场景时仍然存在一定的局限性。如何生成更高质量、更多样化的样本仍然是研究的重点。

  3. 计算资源需求:随着模型的复杂化,如BigGAN、StyleGAN等大型GAN模型的训练需要大量的计算资源和数据,这对于普通研究人员和开发者而言可能是一大挑战。

总结来说,GAN不仅推动了生成模型的发展,也带来了广泛的实战应用。随着研究的深入,未来的GAN技术在生成质量、训练稳定性和应用领域的扩展上仍有巨大的潜力。

2.1.1.3 学习 GAN,CGAN,DCGAN 的 pytroch 代码实现。
基本的GAN实现

生成器

生成器从随机噪声中生成假样本,目标是骗过判别器。

import torch
import torch.nn as nn
​
class Generator(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(True),
            nn.Linear(128, 256),
            nn.ReLU(True),
            nn.Linear(256, 512),
            nn.ReLU(True),
            nn.Linear(512, output_dim),
            nn.Tanh()  # 输出值范围为[-1, 1]
        )
    
    def forward(self, z):
        return self.model(z)
​
# 实例化生成器
input_dim = 100  # 噪声维度
output_dim = 28*28  # 假设是生成28x28的图像
G = Generator(input_dim, output_dim)

判别器

判别器的任务是区分真实样本和生成器生成的假样本。

class Discriminator(nn.Module):
    def __init__(self, input_dim):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid()  # 输出介于0和1之间
        )
    
    def forward(self, x):
        return self.model(x)
​
# 实例化判别器
D = Discriminator(output_dim)

训练GAN

# 损失函数和优化器
criterion = nn.BCELoss()
optimizer_G = torch.optim.Adam(G.parameters(), lr=0.0002)
optimizer_D = torch.optim.Adam(D.parameters(), lr=0.0002)
​
for epoch in range(epochs):
    for real_data in dataloader:
        # 训练判别器
        real_labels = torch.ones(batch_size, 1)
        fake_labels = torch.zeros(batch_size, 1)
        
        real_data = real_data.view(batch_size, -1)  # 展平成28x28
        outputs = D(real_data)
        d_loss_real = criterion(outputs, real_labels)
​
        z = torch.randn(batch_size, input_dim)  # 随机噪声
        fake_data = G(z)
        outputs = D(fake_data.detach())  # 阻止生成器的梯度更新
        d_loss_fake = criterion(outputs, fake_labels)
        
        d_loss = d_loss_real + d_loss_fake
        optimizer_D.zero_grad()
        d_loss.backward()
        optimizer_D.step()
​
        # 训练生成器
        outputs = D(fake_data)
        g_loss = criterion(outputs, real_labels)  # 生成器目标是使判别器认为假样本是真的
        
        optimizer_G.zero_grad()
        g_loss.backward()
        optimizer_G.step()
条件GAN(CGAN)实现

CGAN的区别在于生成器和判别器都接收条件信息(比如类别标签),这让生成器生成特定类型的数据。

生成器

class CGAN_Generator(nn.Module):
    def __init__(self, input_dim, label_dim, output_dim):
        super(CGAN_Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim + label_dim, 128),
            nn.ReLU(True),
            nn.Linear(128, 256),
            nn.ReLU(True),
            nn.Linear(256, 512),
            nn.ReLU(True),
            nn.Linear(512, output_dim),
            nn.Tanh()
        )
    
    def forward(self, z, labels):
        x = torch.cat([z, labels], dim=1)
        return self.model(x)
​
# 生成器输入随机噪声+标签
G = CGAN_Generator(input_dim, label_dim=10, output_dim=28*28)

判别器

class CGAN_Discriminator(nn.Module):
    def __init__(self, input_dim, label_dim):
        super(CGAN_Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim + label_dim, 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )
    
    def forward(self, x, labels):
        x = torch.cat([x, labels], dim=1)
        return self.model(x)
​
# 判别器输入数据+标签
D = CGAN_Discriminator(input_dim=28*28, label_dim=10)

训练CGAN

训练CGAN与GAN类似,但需要在输入数据中同时传递条件信息(如标签)。

for epoch in range(epochs):
    for real_data, labels in dataloader:
        real_labels = torch.ones(batch_size, 1)
        fake_labels = torch.zeros(batch_size, 1)
        
        # 将标签转化为one-hot编码
        labels = torch.nn.functional.one_hot(labels, num_classes=10).float()
​
        # 训练判别器
        real_data = real_data.view(batch_size, -1)
        outputs = D(real_data, labels)
        d_loss_real = criterion(outputs, real_labels)
​
        z = torch.randn(batch_size, input_dim)
        fake_data = G(z, labels)
        outputs = D(fake_data.detach(), labels)
        d_loss_fake = criterion(outputs, fake_labels)
​
        d_loss = d_loss_real + d_loss_fake
        optimizer_D.zero_grad()
        d_loss.backward()
        optimizer_D.step()
​
        # 训练生成器
        outputs = D(fake_data, labels)
        g_loss = criterion(outputs, real_labels)
        optimizer_G.zero_grad()
        g_loss.backward()
        optimizer_G.step()
深度卷积GAN(DCGAN)实现

DCGAN使用卷积神经网络替代了全连接网络,以便在图像生成中取得更好的结果。

生成器

class DCGAN_Generator(nn.Module):
    def __init__(self, z_dim):
        super(DCGAN_Generator, self).__init__()
        self.model = nn.Sequential(
            nn.ConvTranspose2d(z_dim, 512, 4, 1, 0, bias=False),
            nn.BatchNorm2d(512),
            nn.ReLU(True),
            nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
            nn.BatchNorm2d(256),
            nn.ReLU(True),
            nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),
            nn.BatchNorm2d(128),
            nn.ReLU(True),
            nn.ConvTranspose2d(128, 1, 4, 2, 1, bias=False),
            nn.Tanh()
        )
    
    def forward(self, z):
        return self.model(z)
​
G = DCGAN_Generator(z_dim=100)

判别器

class DCGAN_Discriminator(nn.Module):
    def __init__(self):
        super(DCGAN_Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(1, 128, 4, 2, 1, bias=False),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Conv2d(128, 256, 4, 2, 1, bias=False),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Conv2d(256, 512, 4, 2, 1, bias=False),
            nn.BatchNorm2d(512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Conv2d(512, 1, 4, 1, 0, bias=False),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        return self.model(x)
​
D = DCGAN_Discriminator()

训练DCGAN

DCGAN的训练与基础GAN类似,但需要处理图像的维度,因此数据处理时需要对图像进行卷积操作。

# 输入噪声和图像的维度调整
z = torch.randn(batch_size, 100, 1, 1)  # 随机噪声
fake_images = G(z)
outputs = D(fake_images)

2.1.2 Diffusion 模型

从0理解 Diffusion模型-前置知识

一、Diffusion模型概述

Diffusion模型是一种通过逐步添加噪声并在训练过程中学习如何去噪声的生成模型。与传统的生成对抗网络(GAN)不同,Diffusion模型不依赖于对抗训练,而是通过模拟数据从一个简单分布(如高斯分布)逐渐转变为复杂分布来生成样本。

1. Diffusion过程

Diffusion过程可以分为两个阶段:

  • 前向过程(Diffusion Process):逐步向数据添加噪声,直至数据分布接近于高斯分布。

  • 反向过程(Reverse Process):从噪声开始,逐步去噪声,最终生成样本。

2. 数学模型

Diffusion模型可以用一系列方程来描述,这些方程定义了如何在每一步中添加噪声和去噪声的过程。在训练阶段,模型学习如何通过一个神经网络来估计每一步的去噪声过程。

二、变分自编码器(VAE)介绍

作为Diffusion模型的前置知识,VAE是一种常见的深度生成模型。其核心思想是通过编码和解码的方式来生成数据。

1. VAE的工作原理

  • 编码(Encoder):将输入数据映射到潜在空间(latent space),生成潜在变量的概率分布。

  • 解码(Decoder):从潜在变量中重建数据。

2. 数学背景

VAE的训练目标是最大化数据的边际似然,并通过KL散度来约束潜在变量的分布。这一过程涉及到变分推断的相关知识。

三、Diffusion模型与VAE的关系

Diffusion模型和VAE虽然在生成机制上有所不同,但它们都依赖于潜在变量的概念。Diffusion模型可以看作是对VAE思想的一种扩展,通过逐步的噪声过程来实现更高质量的样本生成。

Diffusion 模型简明综述

一、Diffusion模型的基本原理

Diffusion模型的核心思想是通过模拟数据分布的扩散过程来生成样本。其基本流程可以分为两个阶段:前向扩散和反向扩散。

  1. 前向扩散:在这一阶段,原始数据逐步添加噪声,最终转变为标准正态分布。具体而言,给定一个数据样本,Diffusion模型会通过多次迭代,逐步向样本中添加噪声,直到样本几乎变得完全随机。

  2. 反向扩散:这是Diffusion模型的生成阶段。在这一阶段,模型通过训练一个去噪网络,逐步从随机噪声中恢复出原始数据。该过程是通过学习如何在每个时间步长中去除噪声来实现的,从而使得生成的样本逐渐接近真实数据分布。

二、Diffusion模型的算法详解

Diffusion模型的核心算法主要包括以下几个步骤:

  1. 噪声添加过程:定义一个前向过程,将数据样本逐步添加噪声。该过程通常使用一个线性调度的噪声添加策略,以确保在每个时间步中噪声的量是可控的。

  2. 去噪网络训练:通过对比学习的方法训练去噪网络。模型学习从噪声中恢复数据的能力,通常采用均方误差(MSE)作为损失函数,优化网络参数。

  3. 样本生成:在生成阶段,从标准正态分布中采样,经过训练好的去噪网络逐步去噪,最终生成高质量的样本。

三、Diffusion模型的优势与应用

Diffusion模型相较于传统的生成对抗网络(GAN)和变分自编码器(VAE),具有以下优势:

  • 生成质量高:Diffusion模型在许多生成任务中展现出优于其他模型的生成质量,尤其是在图像生成领域。

  • 稳定性强:与GAN相比,Diffusion模型的训练过程更为稳定,容易收敛,减少了模式崩溃的风险。

  • 灵活性高:Diffusion模型可以轻松地与其他模型结合,适用于各种生成任务,如图像超分辨率、图像修复等。

Diffusion 模型技术前沿与落地应用

一、扩散模型基础

视频首先介绍了扩散模型的基本概念,强调了其与传统生成模型的区别。扩散模型通过逐步添加噪声并在最后阶段去噪,来实现高质量的图像生成。与变分自编码器(VAE)等模型相比,扩散模型在生成效果上具有更显著的优势。

1. 噪声与去噪

扩散过程的第一步是向数据添加噪声,然后模型学习如何去除这些噪声,以恢复原始数据。这一过程可以视为一个反向过程,模型的训练目标是最大程度地重构原始数据。

2. 训练和推理

训练阶段通常需要大量的数据和计算资源,但一旦训练完成,推理阶段的生成效率也得到了极大的提升。视频中提到,当前许多大模型如CLIP、DALLE2等都在应用扩散模型。

二、落地应用案例

视频中举例了多个扩散模型的实际应用,包括但不限于:

1. 图像生成

扩散模型在艺术创作、图像编辑等领域的应用非常广泛。例如,利用扩散模型生成高质量的艺术作品,或根据用户的描述生成符合要求的图像。

2. 语音合成

在语音合成领域,扩散模型同样展示了其强大的生成能力。通过对音频数据的处理,能够生成更加自然流畅的语音。

3. 医疗影像分析

扩散模型在医学影像处理中的应用也日益受到关注,通过对医学影像的生成与恢复,辅助医生进行更准确的诊断。

三、技术前沿与挑战

虽然扩散模型在多个领域展现出了良好的性能,但在实际应用中仍然面临一些技术挑战。例如:

1. 计算资源需求

扩散模型的训练和推理都需要大量的计算资源,这对一般开发者来说可能是一个门槛。

2. 模型泛化能力

如何提高扩散模型的泛化能力,使其能够在不同领域和任务中表现良好,依然是一个亟待解决的问题。

2.2 代码练习

该项目包含六个生成对抗网络(GANs)的实现,每种GANs都有其独特的结构和优化方法。

1. Conditional GAN (cgan.py)

理解

  • cGAN通过向生成器和判别器提供条件信息(如类别标签),使得生成的图像满足特定的属性。

代码分析

  • 判别器:由全连接层构成,输入包括图像数据和类别标签,输出图像是否真实的判断。

  • 生成器:同样由全连接层构成,输入是噪声向量和类别标签,输出是生成的图像。

  • 训练:使用MNIST数据集,训练时同时更新生成器和判别器。

关键点

  • 类别标签通过one-hot编码后与图像或噪声向量连接。

  • 训练过程中,生成器学习生成特定类别的图像。

2. Deep Convolutional GAN (dcgan.py)

理解

  • DCGAN使用卷积层和反卷积层,适用于更高维度的图像数据。

代码分析

  • 判别器:由卷积层、批标准化(BatchNorm)和LeakyReLU激活函数构成。

  • 生成器:由反卷积层(ConvTranspose2d)、批标准化和ReLU激活函数构成。

  • 训练:使用权重初始化函数weights_init_normal,训练时使用Adam优化器。

关键点

  • 判别器的最后一层没有激活函数,生成器的最后一层使用Tanh激活函数。

3. Improved Conditional GAN (improved_cgan.py)

理解

  • 在cGAN的基础上引入了“错误标签”,增强了判别器的判别能力。

代码分析

  • 判别器:除了接受图像和真实类别标签,还接受错误类别标签。

  • 训练:引入了额外的损失项,包括真实图像与错误标签的损失。

关键点

  • 通过提供错误标签,提高了判别器的鲁棒性。

4. Vanilla GAN (vanilla_gan.py)

理解

  • 最基础的GAN实现,没有使用卷积层。

代码分析

  • 判别器生成器都由简单的全连接层构成。

  • 训练:使用MNIST数据集,训练时更新生成器和判别器。

关键点

  • 判别器最后一层使用Sigmoid激活函数,生成器最后一层使用Tanh激活函数。

5. Wasserstein GAN with Gradient Penalty (wgan-gp.py)

理解

  • WGAN-GP通过梯度惩罚项来约束判别器,使得训练更加稳定。

代码分析

  • 判别器:由全连接层构成,输出没有激活函数。

  • 训练:引入梯度惩罚项compute_gradient_penalty,使用RMSprop优化器。

关键点

  • 使用权重截断技术来约束判别器的参数,保证利普希茨限制。

6. Wasserstein GAN (wgan.py)

理解

  • WGAN使用Wasserstein距离作为损失函数,提高了训练的稳定性。

代码分析

  • 判别器:由全连接层构成,输出没有激活函数。

  • 训练:使用RMSprop优化器,并在每次更新后对判别器的权重进行截断。

关键点

  • 权重截断技术用于保证判别器的参数在一定范围内。

实验记录
  • 数据集:所有实验均使用MNIST数据集。

  • 训练周期:每个实验的训练周期不同,从100到200不等。

  • 损失函数:使用二值交叉熵损失(BCELoss)和Wasserstein损失。

  • 优化器:主要使用Adam和RMSprop优化器。

结果分析
  • 图像质量:随着GANs的发展,生成的图像质量逐渐提高。

  • 训练稳定性:WGAN和WGAN-GP相比传统的GANs更加稳定。

三、程序运行结果

CGAN

DCGAN

四、问题总结与体会

收获和体会

  1. 深入理解了生成器与判别器的对抗博弈机制,尤其是如何通过这种方式提高生成数据的质量。

  2. 学习到如何通过引入条件信息(CGAN)和使用卷积神经网络(DCGAN)提高生成效果,特别是在图像生成方面。

  3. 通过 Pytorch 实现了 GAN、CGAN 和 DCGAN,虽然 GPU 资源有限,但通过代码分析进一步加深了对模型结构的理解。

  4. 认识到 Diffusion 模型通过逐步去噪生成数据的独特方式,避免了 GAN 中常见的模式崩溃问题。

  5. Diffusion 模型生成的图片质量更高且稳定性更好,为未来的生成式模型提供了新的研究方向。

  6. 了解了生成模型在图像生成、音频合成等领域的技术前沿,看到其广泛的应用前景。

  7. 理论学习结合代码实践,使得我对 GAN 和 Diffusion 模型的理解更为深刻,理论与实践并行提高了学习效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值