当前位置: 首页 > news >正文

深度学习入门Day8:生成模型革命——从GAN到扩散模型

一、开篇:创造力的算法革命

从昨天的Transformer到今天的生成模型,我们正从"理解"世界迈向"创造"世界。生成对抗网络(GAN)和扩散模型(Diffusion Model)代表了当前生成式AI的两大主流范式,它们让机器能够生成逼真的图像、音乐甚至视频。今天我们将深入这两种技术的核心原理,并亲自动手实现图像生成的神奇过程。

二、上午攻坚:GAN原理与实战

2.1 GAN核心架构解析

最小最大博弈公式:
min_G max_D V(D,G) = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1-D(G(z)))]

DCGAN关键实现:
# 生成器网络
class Generator(nn.Module):
def __init__(self, latent_dim=100):
super().__init__()
self.main = nn.Sequential(
# 输入: (latent_dim, 1, 1)
nn.ConvTranspose2d(latent_dim, 512, 4, 1, 0, bias=False),
nn.BatchNorm2d(512),
nn.ReLU(True),
# 输出: (512, 4, 4)
nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.ReLU(True),
# 输出: (256, 8, 8)
nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),
nn.BatchNorm2d(128),
nn.ReLU(True),
# 输出: (128, 16, 16)
nn.ConvTranspose2d(128, 1, 4, 2, 1, bias=False),
nn.Tanh()  # 输出范围[-1,1]
# 最终输出: (1, 28, 28)
)

    def forward(self, input):
return self.main(input)

# 判别器网络
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.main = nn.Sequential(
# 输入: (1, 28, 28)
nn.Conv2d(1, 128, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (128, 14, 14)
nn.Conv2d(128, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (256, 7, 7)
nn.Conv2d(256, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (512, 3, 3)
nn.Conv2d(512, 1, 3, 1, 0, bias=False),
nn.Sigmoid()  # 输出概率
)

    def forward(self, input):
return self.main(input).view(-1)

2.2 GAN训练技巧与可视化

训练循环关键代码:
for epoch in range(epochs):
for i, (real_imgs, _) in enumerate(dataloader):

# 训练判别器
optimizer_D.zero_grad()

# 真实图像损失
real_loss = criterion(D(real_imgs), real_labels)

# 生成假图像
z = torch.randn(batch_size, latent_dim, 1, 1)
fake_imgs = G(z)
fake_loss = criterion(D(fake_imgs.detach()), fake_labels)

d_loss = real_loss + fake_loss
d_loss.backward()
optimizer_D.step()

# 训练生成器
optimizer_G.zero_grad()
g_loss = criterion(D(fake_imgs), real_labels)  # 骗过判别器
g_loss.backward()
optimizer_G.step()

模式坍塌诊断与解决:
- 现象:生成器只产生少量模式样本
- 解决方案:
- 使用Wasserstein GAN (WGAN)
- 添加多样性惩罚项
- 尝试小批量判别(Minibatch Discrimination)

生成过程可视化:
# 固定潜在向量观察生成演变
fixed_z = torch.randn(64, latent_dim, 1, 1)
sample_imgs = G(fixed_z).detach()
grid = torchvision.utils.make_grid(sample_imgs, nrow=8)
plt.imshow(grid.permute(1, 2, 0))
plt.show()

三、下午探索:扩散模型原理与实践

3.1 扩散过程数学描述

前向扩散(加噪):
q(x_t|x_{t-1}) = N(x_t; √(1-β_t)x_{t-1}, β_tI)
其中β_t是噪声调度

反向去噪(生成):
p_θ(x_{t-1}|x_t) = N(x_{t-1}; μ_θ(x_t,t), Σ_θ(x_t,t))

DDPM简化训练目标:
def diffusion_loss(model, x0, t):
# 随机时间步
t = torch.randint(0, T, (x0.size(0),)

# 计算加噪后的样本
sqrt_alpha_bar = extract(sqrt_alpha_bar_t, t, x0.shape)
sqrt_one_minus_alpha_bar = extract(sqrt_one_minus_alpha_bar_t, t, x0.shape)
noise = torch.randn_like(x0)
xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise

# 预测噪声
predicted_noise = model(xt, t)

# 计算损失
return F.mse_loss(predicted_noise, noise)

3.2 扩散模型实践

使用Diffusers库生成图像:
from diffusers import DDPMPipeline, DDPMScheduler

# 加载预训练模型
pipe = DDPMPipeline.from_pretrained("google/ddpm-cifar10-32")

# 生成图像
image = pipe().images[0]
image.save("generated_image.png")

自定义采样过程:
def sample_ddpm(model, shape, steps=50):
x = torch.randn(shape)
for t in reversed(range(steps)):
t_tensor = torch.full((shape[0],), t, dtype=torch.long)
with torch.no_grad():
pred_noise = model(x, t_tensor)

alpha_t = alpha[t]
alpha_bar_t = alpha_bar[t]
beta_t = beta[t]

if t > 0:
noise = torch.randn_like(x)
else:
noise = 0

x = (x - (1-alpha_t)/torch.sqrt(1-alpha_bar_t)*pred_noise)/torch.sqrt(alpha_t)
x += torch.sqrt(beta_t) * noise

return x

四、生成模型应用全景

4.1 图像超分辨率实现

# 使用ESRGAN (Enhanced Super-Resolution GAN)
from basicsr.archs.rrdbnet_arch import RRDBNet
model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23)

4.2 艺术风格迁移

# 基于扩散模型的风格迁移
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
image = pipe("Van Gogh style landscape").images[0]

4.3 医学图像合成

# 使用条件GAN生成CT扫描图像
class MedGAN(nn.Module):
def __init__(self):
super().__init__()
self.encoder = ...  # 编码临床参数
self.generator = ...  # 生成图像
self.discriminator = ...  # 判别真实/生成

五、学习总结与明日计划

5.1 今日核心成果

✅ 实现DCGAN并生成MNIST/Fashion-MNIST图像  
✅ 理解扩散模型的前向/反向过程  
✅ 使用Diffusers库完成图像生成  
✅ 探索生成模型在超分辨率等场景的应用  

5.2 关键问题记录

❓ GAN训练不稳定的根本原因  
❓ 扩散模型采样加速方法  
❓ 生成结果的评估指标选择  

5.3 明日学习重点

- 图神经网络(GNN)基础概念
- 图卷积网络(GCN)实现
- 节点分类与图分类任务
- 图注意力网络(GAT)初探

六、资源推荐与延伸阅读

1. GAN Zoo:各类GAN变体集合  
2. Diffusion Models Beat GANs:扩散模型里程碑论文  
3. Stable Diffusion WebUI:最强开源图像生成工具  
4. 生成模型可视化:交互式理解GAN训练  

七、实践心得与伦理思考

1. 生成模型调试技巧:
- GAN:监控D_loss和G_loss的平衡
- 扩散:可视化中间去噪过程
- 通用:使用固定随机种子复现问题

2. 伦理边界警示:
# 人脸生成伦理检查
if task == "face_generation":
assert has_ethical_approval, "需要伦理审查"
add_watermark(output_image)

3. 实用代码片段:
# 潜在空间插值
z1 = torch.randn(1, latent_dim)
z2 = torch.randn(1, latent_dim)
for alpha in torch.linspace(0, 1, 10):
z = alpha*z1 + (1-alpha)*z2
generated = G(z)

下篇预告:《Day9:图神经网络入门—非欧空间的数据智慧》  
将探索社交网络、分子结构等图数据的深度学习处理方法!

http://www.dtcms.com/a/323197.html

相关文章:

  • Vue 3.6 Vapor模式完全指南:告别虚拟DOM,性能飞跃式提升
  • 大模型“涌现”背后的暗线——规模、数据、目标函数的三重协奏
  • 华为实验:SSH
  • P1890 gcd区间
  • 在 VS Code 或 Visual Studio 2022 上搭建 ESP32-CAM 开发环境
  • 微软将于 10 月停止混合 Exchange 中的共享 EWS 访问
  • 论文复现内容关于一种新的线性电机系统齿槽力模型
  • 关于TensorRT的若干报错问题
  • [Oracle] TRUNC()函数
  • W25Q64中跨页写入数据
  • 总结-ArrayList的扩容机制和BigDecimal大数的底层
  • 机器学习DBSCAN密度聚类
  • 如何更改win11自带录音机所录制文件的存储路径
  • 禁用 WordPress 更新提示(核心、插件、主题)
  • 【重建技巧】Urban Scene Reconstruction-LoD细节提升
  • springBoot集成easyExcel 实现文件上传
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • 集成电路学习:什么是RViz机器人可视化工具
  • Java 时间和空间复杂度
  • 徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析
  • 二叉搜索树的C语言实现
  • 《软件测试与质量控制》实验报告五 功能自动化测试
  • 掌握数据可视化:全局配置项详解
  • Java进阶之单列集合List接口下的通用方法
  • Ubuntu22.04 安装vitis2023.2 卡在“Generating installed device list“.
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 用 C 语言深入理解 Linux 软链接:原理、API 与编程实践
  • 【CTF】PHP反序列化基础知识与解题步骤
  • Claude Code 的核心能力与架构解析
  • Alibaba Cloud Linux 3 生成 github 公钥