当前位置: 首页 > 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.lryc.cn/news/615674.html

相关文章:

  • pytorch llm 计算flops和参数量
  • Busybox编译、制作initramfs,并在QEMU中运行
  • 束搜索(Beam Search):原理、演进与挑战
  • Java -- 日期类-第一代-第二代-第三代日期
  • NLP:Transformer输出部分
  • 第十九天-输入捕获实验
  • AI编程工具 | Trae介绍
  • Linux高级编程-文件操作
  • SpringBoot 集成 MapStruct
  • Vue 3.6 Vapor模式完全指南:告别虚拟DOM,性能飞跃式提升
  • 使用GTX ip core + SDI IP core实现SDI设计
  • Vue3 路由
  • C++算法练习:单词识别
  • 决策树技术详解:从理论到Python实战
  • 【ref、toRef、toRefs、reactive】
  • 多级缓存详解
  • 《励曼旋耕》Liman Rotary Tillage
  • Python如何合并两个Excel文件
  • 花生4CL基因家族鉴定及对干旱与盐胁迫响应分析--文献精读157
  • 本地进行语音文字互转
  • CVPR中深度学习新范式:通用性、鲁棒性与多模态的创新突破
  • 分布式事务Seata TCC模式篇
  • Linux网络转发系统框架分析
  • 【密码学】7. 数字签名
  • orcad的操作(1)
  • 【LLM】Openai之gpt-oss模型和GPT5模型
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • DAY35打卡
  • 【js】判断异步函数的返回值要加await
  • 【机器学习深度学习】模型选型:如何根据现有设备选择合适的训练模型