AI 大模型之 机器学习 生成模型 GAN / 变分自编码器 / 扩散模型 实战

AI人工智能阿木 发布于 2025-07-13 11 次阅读


生成模型实战:GAN、变分自编码器与扩散模型

生成模型是机器学习领域的一个重要分支,它们旨在学习数据分布并生成新的数据样本。在图像、音频和文本等复杂数据类型中,生成模型的应用越来越广泛。本文将围绕生成对抗网络(GAN)、变分自编码器(VAE)和扩散模型,通过实战代码展示这些生成模型的基本原理和应用。

1. GAN(生成对抗网络)

1.1 基本原理

GAN由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器的目标是生成与真实数据分布相似的样本,而判别器的目标是区分真实样本和生成样本。两者在对抗训练中不断优化,最终生成器能够生成高质量的样本。

1.2 实战代码

以下是一个使用PyTorch实现的简单GAN示例:

python

import torch


import torch.nn as nn


import torch.optim as optim

定义生成器和判别器


class Generator(nn.Module):


def __init__(self):


super(Generator, self).__init__()


self.model = nn.Sequential(


nn.Linear(100, 256),


nn.ReLU(),


nn.Linear(256, 512),


nn.ReLU(),


nn.Linear(512, 1024),


nn.ReLU(),


nn.Linear(1024, 784),


nn.Tanh()


)

def forward(self, x):


return self.model(x)

class Discriminator(nn.Module):


def __init__(self):


super(Discriminator, self).__init__()


self.model = nn.Sequential(


nn.Linear(784, 1024),


nn.LeakyReLU(0.2),


nn.Linear(1024, 512),


nn.LeakyReLU(0.2),


nn.Linear(512, 256),


nn.LeakyReLU(0.2),


nn.Linear(256, 1),


nn.Sigmoid()


)

def forward(self, x):


return self.model(x).view(-1)

初始化生成器和判别器


generator = Generator()


discriminator = Discriminator()

定义损失函数和优化器


criterion = nn.BCELoss()


optimizer_G = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))


optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))

训练过程


for epoch in range(epochs):


for i, (images, _) in enumerate(dataloader):


训练判别器


optimizer_D.zero_grad()


real_data = images.view(images.size(0), -1)


fake_data = generator(noise torch.randn(images.size(0), 100)).view(images.size(0), -1)


real_loss = criterion(discriminator(real_data), torch.ones(images.size(0), 1))


fake_loss = criterion(discriminator(fake_data.detach()), torch.zeros(images.size(0), 1))


d_loss = real_loss + fake_loss


d_loss.backward()


optimizer_D.step()

训练生成器


optimizer_G.zero_grad()


g_loss = criterion(discriminator(fake_data), torch.ones(images.size(0), 1))


g_loss.backward()


optimizer_G.step()

打印训练信息


if i % 100 == 0:


print(f"Epoch [{epoch}/{epochs}], Step [{i}/{len(dataloader)}], D_loss: {d_loss.item()}, G_loss: {g_loss.item()}")


2. VAE(变分自编码器)

2.1 基本原理

VAE是一种基于概率模型的生成模型,它通过编码器(Encoder)和解码器(Decoder)学习数据分布的潜在表示。编码器将输入数据映射到潜在空间,解码器则将潜在空间的数据映射回原始空间。

2.2 实战代码

以下是一个使用PyTorch实现的简单VAE示例:

python

import torch


import torch.nn as nn


import torch.optim as optim

定义编码器和解码器


class Encoder(nn.Module):


def __init__(self):


super(Encoder, self).__init__()


self.model = nn.Sequential(


nn.Linear(784, 512),


nn.ReLU(),


nn.Linear(512, 256),


nn.ReLU(),


nn.Linear(256, 100)


)

def forward(self, x):


mu, logvar = self.model(x).chunk(2, dim=1)


return mu, logvar

class Decoder(nn.Module):


def __init__(self):


super(Decoder, self).__init__()


self.model = nn.Sequential(


nn.Linear(100, 256),


nn.ReLU(),


nn.Linear(256, 512),


nn.ReLU(),


nn.Linear(512, 784),


nn.Tanh()


)

def forward(self, x):


return self.model(x)

初始化编码器、解码器和潜在空间


encoder = Encoder()


decoder = Decoder()


latent_dim = 100

定义损失函数和优化器


criterion = nn.MSELoss()


optimizer = optim.Adam(list(encoder.parameters()) + list(decoder.parameters()), lr=0.001)

训练过程


for epoch in range(epochs):


for i, (images, _) in enumerate(dataloader):


前向传播


mu, logvar = encoder(images)


z = mu + torch.exp(0.5 logvar) torch.randn_like(mu)


recon_images = decoder(z)

计算损失


loss = criterion(recon_images, images) + 0.5 torch.sum(logvar) - 0.5 torch.sum(mu 2)

反向传播和优化


optimizer.zero_grad()


loss.backward()


optimizer.step()

打印训练信息


if i % 100 == 0:


print(f"Epoch [{epoch}/{epochs}], Step [{i}/{len(dataloader)}], Loss: {loss.item()}")


3. 扩散模型

3.1 基本原理

扩散模型是一种基于深度学习的生成模型,它通过逐步将数据从真实分布扩散到均匀分布,再反向扩散回真实分布,从而学习数据分布。

3.2 实战代码

以下是一个使用PyTorch实现的简单扩散模型示例:

python

import torch


import torch.nn as nn


import torch.optim as optim

定义扩散模型


class DiffusionModel(nn.Module):


def __init__(self):


super(DiffusionModel, self).__init__()


self.encoder = nn.Sequential(


nn.Linear(784, 512),


nn.ReLU(),


nn.Linear(512, 256),


nn.ReLU(),


nn.Linear(256, 128),


nn.ReLU(),


nn.Linear(128, 64),


nn.ReLU(),


nn.Linear(64, 32),


nn.ReLU(),


nn.Linear(32, 16),


nn.ReLU(),


nn.Linear(16, 8),


nn.ReLU(),


nn.Linear(8, 4),


nn.ReLU(),


nn.Linear(4, 2)


)

def forward(self, x):


return self.encoder(x)

初始化扩散模型


model = DiffusionModel()

定义损失函数和优化器


criterion = nn.MSELoss()


optimizer = optim.Adam(model.parameters(), lr=0.001)

训练过程


for epoch in range(epochs):


for i, (images, _) in enumerate(dataloader):


前向传播


z = model(images)

计算损失


loss = criterion(z, torch.randn_like(z))

反向传播和优化


optimizer.zero_grad()


loss.backward()


optimizer.step()

打印训练信息


if i % 100 == 0:


print(f"Epoch [{epoch}/{epochs}], Step [{i}/{len(dataloader)}], Loss: {loss.item()}")


总结

本文通过实战代码展示了GAN、VAE和扩散模型的基本原理和应用。这些生成模型在图像、音频和文本等复杂数据类型中具有广泛的应用前景。在实际应用中,可以根据具体需求选择合适的生成模型,并通过调整模型结构和参数来提高生成质量。