深度学习(7)---Diffusion Model概念讲解

本文介绍了扩散模型的基本原理,重点阐述了StableDiffusion如何提高生成速度,通过FID评估模型生成图像的质量,并展示了CLIP在连接文本与图像生成中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、基本概括

1.1 概念讲解

 1. Diffusion Model是一种生成模型,通过连续添加高斯噪声来破坏训练数据,然后学习反转的去噪过程来恢复数据。它分为正向的扩散过程和反向的逆扩散过程。正向扩散过程是往图片上加噪声的过程,即从无到有地添加噪声,直到得到纯噪声图片。反向扩散过程则是通过学习如何从噪声图片恢复到原始图片。

 2. 正向过程:首先,对于一张原始图片 X 0 X_0 X0,我们给 X 0 X_0 X0 图片添加高斯噪声,图片由 X 0 X_0 X0 变为 X 1 X_1 X1。接着我们会在 X 1 X_1 X1 的基础上再添加高斯噪声得到 X 2 X_2 X2。重复上述添加高斯噪声步骤,直到图片变成 X n X_n Xn。由于添加了足够多的高斯噪声,现在的 X n X_n Xn 近似服从高斯分布(又称正态分布)。
注意:(1) 这里必须要加高斯噪声,因为高斯噪声服从高斯分布,后面的一些运算需要用到高斯分布的一些特性。(2) 每步添加高斯噪声的量是变化的,且后一步比前一步添加的高斯噪声更多。

在这里插入图片描述

 3. 逆向过程:首先,我们会随机生成一个服从高斯分布的噪声图片,然后一步一步的减少噪声直到生成预期图片。

在这里插入图片描述

1.2 Denoise模块

 去噪过程不是说由一张图片生成另一张图片,而是在一张高噪声图片的基础上,减掉一个噪声图片从而得到另一张低噪声图片。

在这里插入图片描述

在这里插入图片描述

二、Stable Diffusion

2.1 概念讲解

 1. 通过上面所述我们可得:当扩散步数和图像很大时,这种纯扩散模型会非常慢。为了解决这个问题,Stable Diffusion 应运而生。Stable Diffusion是一个文本到图像的潜在扩散模型。顾名思义,Stable Diffusion 发生在潜在空间中,这就是它比纯扩散模型更快的原因。

 2. Stable Diffusion第一步会将文本转换成向量;第二步会产生一个随机潜在噪声作为输入和文本转换后的向量产生一个 “中间产物”;第三步通过 “中间产物” 还原成原始图片。通常三个模块分开训练,最后组合在一起。

在这里插入图片描述

 论文中的Stable Diffusion结构图如下图所示:

在这里插入图片描述

 3. 如下图谷歌的由文本生成图片的模型也是大同小异。

在这里插入图片描述

 4. 第三步处理的 “中间产物” 可以是小图,也可以是图像潜在表示。

在这里插入图片描述

在这里插入图片描述

 5. Stable Diffusion第二步生成 “中间产物” 过程类似于Diffusion Model中Noise Predicter产生 “中间产物” 的过程。

在这里插入图片描述

在这里插入图片描述

2.2 FID

 在扩散模型中,FID(Frechet Inception Distance)是一种用于评估生成图像质量的度量标准。它衡量的是生成图像与真实图像之间的距离,其值越小代表生成的图像质量越高。FID的计算方法包括提取真实图像和生成图像的特征向量,并计算二者的Frechet距离。

在这里插入图片描述

2.3 CLIP

 CLIP(Contrastive Language–Image Pre-training)是一种多模态学习框架,旨在将语言和图像信息结合起来进行预训练。CLIP通过对比图像和文本的embedding来衡量两者之间的相似性,从而实现了对图像和文本的匹配。在扩散模型中,CLIP可以作为打通文本和图像的桥梁的核心模块,用于控制图像生成的过程。

在这里插入图片描述

### 扩散模型代码实现与解析 扩散模型是一种强大的生成模型,在图像生成等领域取得了显著成果。下面将展示如何通过Python代码实现一个简单的扩散模型。 #### 1. 导入必要的库 为了构建扩散模型,需要导入一些常用的机器学习和深度学习库: ```python import torch from torch import nn, optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader import numpy as np import matplotlib.pyplot as plt ``` #### 2. 定义前向过程 (Forward Process)扩散模型中,前向过程是指逐渐增加噪声的过程。这一步骤对于训练至关重要[^1]。 ```python def forward_process(x_0, t, beta_max=0.02): """ 前向过程中加入高斯噪声 参数: x_0 : 初始输入数据 t : 时间步数 beta_max : 最大噪音强度 返回: xt : 加噪后的样本 noise : 添加的随机噪声 """ # 计算beta_t betas = torch.linspace(1e-4, beta_max, steps=t).to(device=x_0.device) # 获取alpha_bar_t alpha_bars = torch.cumprod(1 - betas, dim=0) # 随机采样标准正态分布作为噪声 noise = torch.randn_like(x_0) # 应用加权平均得到xt xt = ( torch.sqrt(alpha_bars[t]) * x_0 + torch.sqrt(1 - alpha_bars[t]) * noise ) return xt, noise ``` #### 3. 构建去噪网络结构 这里采用UNet架构来预测每一步应该去除多少噪声。该网络能够有效地捕捉到不同尺度下的特征信息[^2]。 ```python class UNet(nn.Module): def __init__(self): super().__init__() self.encoder_layers = nn.Sequential( ConvBlock(in_channels=1, out_channels=64), DownSample(), ConvBlock(in_channels=64, out_channels=128), DownSample(), ... ) ... def forward(self, x, timestep_embedding=None): """定义向前传播""" ... ``` 由于篇幅原因,上述`ConvBlock`, `DownSample`等组件的具体实现未完全给出,实际应用时需补充完整这些模块。 #### 4. 反向过程 (Reverse Process) 反向过程即是从纯噪声逐步恢复原始信号的关键环节。此阶段利用之前提到的UNet来进行迭代优化。 ```python @torch.no_grad() def reverse_process(model, shape=(1, 28, 28), T=1000, device='cpu'): img = torch.randn(shape, device=device) for i in reversed(range(T)): t = torch.full((shape[0], ), i, dtype=torch.long, device=device) pred_noise = model(img, t) beta_t = get_beta(i) alpha_t = 1 - beta_t alpha_cumprod_prev = ... if i>0 else 1. posterior_variance = beta_t * (1-alpha_cumprod_prev)/(1-get_alpha_cumprod(i)) mean_pred = ((img - beta_t*pred_noise/torch.sqrt(1.-get_alpha_cumprod(i))) / torch.sqrt(alpha_t)) + \ posterioir_variance * torch.randn_like(img)*i/T img = mean_pred.clamp(-1., 1.) return img.cpu().numpy()[0] ``` 以上展示了简化版的扩散模型编码方式及其核心算法逻辑。需要注意的是,真实场景下还需要考虑更多细节问题,比如更复杂的损失函数设计、超参数调整以及性能调优等方面的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒冒菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值