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

深度学习入门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.xdnf.cn/news/17329.html

相关文章:

  • 如何优雅的使用进行参数校验
  • Day02 员工管理,分类管理
  • 202506 电子学会青少年等级考试机器人六级器人理论真题
  • 黑马SpringAI项目-聊天机器人
  • DeepSeek智能考试系统智能体
  • 大语言模型提示工程与应用:ChatGPT提示工程技术指南
  • 华为实验NAT
  • [Oracle] ADD_MONTHS()函数
  • 【Avalonia】无开发者账号使用iOS真机调试跨平台应用
  • 【SpringBoot】SpringWeb的开发
  • Cursor CLI 来了,准备 Build anything
  • ESP32-menuconfig(3) -- Serial flasher config
  • 四、redis入门之集群部署
  • 【LLM开发学习】
  • 应用层自定义协议
  • Redis基础数据类型
  • 广东省省考备考(第七十天8.8)——言语、判断推理(强化训练)
  • 01Vue3
  • [优选算法专题一双指针——三数之和]
  • Python训练营打卡Day26-函数专题2:装饰器
  • 最长回文子串
  • 远期(Forward)交易系统全球金融市场解决方案报告
  • Java 之 设计模式
  • Python名称映射技术:基于序列元素的高级访问模式详解
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 豆包新模型+PromptPilot:AI应用开发全流程实战指南
  • 【C++高阶五】mapset对红黑树的封装
  • Nestjs框架: 接口安全与响应脱敏实践 --- 从拦截器到自定义序列化装饰器
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 大语言模型提示工程与应用:提示词基础使用方式