网站开发模板图片,网站建站咨询,佛山网站建设专业,企业网站app开发平台【算法简历修改、职业规划、校招实习咨询请私信联系】
【Latent-Diffusion 代码】 生成模型分类概述
Diffusion Model#xff0c;这一深度生成模型#xff0c;源自物理学中的扩散现象#xff0c;呈现出令人瞩目的创新性。与传统的生成模型#xff0c;如VAE、GAN相比…【算法简历修改、职业规划、校招实习咨询请私信联系】
【Latent-Diffusion 代码】 生成模型分类概述
Diffusion Model这一深度生成模型源自物理学中的扩散现象呈现出令人瞩目的创新性。与传统的生成模型如VAE、GAN相比**它通过模拟数据由随机噪声逐步扩散至目标数据的过程实现数据生成。**在图像、文本和音频生成等多个领域Diffusion Model均展现出了卓越的性能。
其算法原理深入浅出将数据生成过程视为一个马尔可夫链。数据从目标状态出发每一步都逐渐向随机噪声过渡直至达到纯粹的噪声状态。随后通过逆向过程数据从纯噪声逐渐恢复至目标状态。这一复杂过程通过一系列的条件概率分布得以精确描述。 优化过程则是通过最小化真实数据与生成数据之间的差异对模型进行训练。常用的损失函数包括MSE均方误差和BCE二元交叉熵。
import torch
import torch.nn as nn
import torch.optim as optim# 定义U-Net模型
class UNet(nn.Module):
# ...省略模型定义...# 定义Diffusion Model
class DiffusionModel(nn.Module):def __init__(self, unet):super(DiffusionModel, self).__init__()self.unet unetdef forward(self, x_t, t):# x_t为当前时刻的数据t为噪声水平# 利用U-Net预测噪声水平noise_pred self.unet(x_t, t)# 根据预测的噪声水平生成数据x_t_minus_1 x_t - noise_pred * torch.sqrt(1 - torch.exp(-2 * t))return x_t_minus_1# 初始化模型和优化器
unet UNet()
model DiffusionModel(unet)
# 训练过程
for epoch in range(num_epochs):for x_real in dataloader: # 从数据加载器中获取真实数据# 前向过程x_t x_real # 从真实数据开始for t in torch.linspace(0, 1, num_steps):# 添加噪声noise torch.randn_like(x_t) * torch.sqrt(1 - torch.exp(-2 * t))x_t x_t noise * torch.sqrt(torch.exp(-2 * t))# 计算预测噪声noise_pred model(x_t, t)# 计算损失loss nn.MSELoss()(noise_pred, noise)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()1.DDPM(Denoising diffusion probabilistic model) 1.1潜在扩散模型Latent diffusion model,LDM
DDPM 模型在生成图像质量上效果已经非常好但它也有个缺点 那就是 x 0 x_{0} x0 的尺寸是和图片一致的 x 0 x_{0} x0 的元素和图片的像素是一一对应的 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸是3xHxW如果想生成一张高尺寸的图像 它的张量大小是非常大的这就需要极大的显卡硬件资源包括计算资源和显存资源。 同样的它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展。
论文 High-Resolution Image Synthesis with Latent Diffusion Models [1]针对这个问题做了一些改进 主要的改进点有1引入一个自编码器先对原始对象进行压缩编码编码后的向量再应用到扩散模型2通过在 UNET 中加入 Attention 机制处理条件变量 1.1.1 潜在空间
针对 DDPM 消耗资源的问题解决方法也简单。 引入一个自编码器比如上一章介绍的变分编码器VAE先对原始图像进行压缩编码得到图像的低维表示 z 0 z_{0} z0 然后 z 0 z_{0} z0 作为 DDPM 的输入执行 DDPM 的算法过程DDPM 生成的结果再经过解码器还原成图像。 由于 z 0 z_{0} z0 是压缩过的其尺寸远远小于原始的图像这样就能极大的减少 DDPM 资源的消耗。 压缩后 z 0 z_{0} z0 所在的数据空间称为潜在空间latent space, 可以称为潜在数据。
这个自编码器VAE可以是提前预训练好的模型在训练扩散模型时自编码器的参数是冻住的 如图 7.1.2 所示。通过使用预训练的编码器 我们可以将全尺寸图像编码为低维潜在空间数据压缩数据。通过使用预训练的解码器 我们可以将潜在空间数据解码回图像。
这样在 DDPM 外层增加一个 VAE 后DDPM 的扩散过程和降噪过程都是在潜空间Latent Space进行 潜空间的尺寸远远小于像素空间极大了降低了硬件资源的需求同时也能加速整个过程。
正向扩散过程→给潜在数据增加噪声逆向扩散过程→从潜在数据中消除噪声。 整个 DDPM 的过程都是在潜在空间执行的 所以这个算法被称为潜在扩散模型Latent diffusion model,LDM。 增加一个自编码器并没有改变 DDPM 的算法过程所以并不需要对 DDPM 算法代码做任何改动。 ### 1.1.2条件处理
在 DDPM 的过程中可以增加额外的指导信息使其生成我们的想要的图像 比如文本生成图像、图像生成图像等等。
用符号 y y y表示额外的条件数据用 τ \tau τ表示 y y y的加工处理过程它负责把 y y y加工成特征向量。 比如如果 y y y是一段文本的 prompt τ \tau τ就可以是一个 text-encoder 论文中使用的预训练好的 CLIP 模型中的 text-encoder。 之所以用 CLIP 模型的 text-encoder 是因为 CLIP 模型本身就是一个文本图像的多模态模型 它的 text-encoder 能更贴近图像的特征空间 这里选用一个预训练好的 CLIP 模型即可。
通过在 UNET 网络中增加 Attention 机制把文本的嵌入向量加入到 UNET 网络中。加入不同的内容可以通过一个开关switch来控制 如 图 7.1.4 所示。
1.1.3 训练过程
相比于 DDPM 条件化的 LDM 目标函数稍微变化了一点具体变化内容可以参考 图 7.1.5。 图 7.1.6 是 LDM 采样过程的图形化表示 过程并不复杂经过 DDPM 采样生成的 z 0 z_{0} z0需要用解码器D还原成图像。 2. 稳定扩散模型Stable diffusion,SD
LDM 本身是由 CompVis 提出并联合 Runway ML进行开发实现后来 Stability AI 也参与进来并提供了一些资源 联合搞了一个预训练的 LDM 模型称为 Stable diffusion。 所以Stable diffusion 是 LDM 的一个开源预训练模型由于它的开源迅速火爆起来。 目前 Stable diffusion 已经占据了图像生成开源领域的主导地位。
diffusion model 原理解释 x T ( x 0 , ϵ ) a t x 0 1 − a t ϵ x_{T}(x_{0}, \epsilon)\sqrt{a_{t}} x_{0}\sqrt{1-a_{t}}\epsilon xT(x0,ϵ)at x01−at ϵ其中 ϵ \epsilon ϵ是噪声, 符合 0 均值, 1 方差的正态分布
一文读懂扩散模型Diffusion Models