【生成模型之二】diffusion model模型
【算法简历修改、职业规划、校招实习咨询请私信联系】
【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 算法代码做任何改动。
在 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,ϵ)=atx0+1−atϵ,其中 ϵ \epsilon ϵ是噪声, 符合 0 均值, 1 方差的正态分布
一文读懂扩散模型(Diffusion Models)
相关文章:
【生成模型之二】diffusion model模型
【算法简历修改、职业规划、校招实习咨询请私信联系】 【Latent-Diffusion 代码】 生成模型分类概述 Diffusion Model,这一深度生成模型,源自物理学中的扩散现象,呈现出令人瞩目的创新性。与传统的生成模型,如VAE、GAN相比&…...
记录 Maven 版本覆盖 Bug 的解决过程
背景 在使用 Maven 进行项目管理时,依赖版本的管理是一个常见且重要的环节。最近,在我的项目中遇到了一个关于依赖版本覆盖的 Bug,这个问题导致了 Apollo 框架的版本不一致,影响了项目的正常运行。以下是我解决这个问题的过程记录…...
【K8S系列】Kubernetes Service 基础知识 详细介绍
在 Kubernetes 中,Service 是一种抽象的资源,用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口,解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…...
python在物联网领域的数据应用分析与实战!
引言 物联网(IoT)是一个快速发展的领域,涉及到各种设备和传感器的连接与数据交换。随着设备数量的激增,数据的产生速度也在不断加快。 如何有效地分析和利用这些数据,成为了物联网应用成功的关键。Python作为一种强大的编程语言,因其简洁易用的特性和丰富的库支持,成为…...
目标跟踪算法-卡尔曼滤波详解
卡尔曼滤波是一种递归的优化算法,用于估计一个系统的动态状态,常用于跟踪、导航、时间序列分析等领域。它的关键在于使用一系列测量数据(通常含噪声)来估计系统的真实状态,使得估计值更接近实际情况。卡尔曼滤波器适合…...
SpringBoot后端开发常用工具详细介绍——application多环境配置与切换
文章目录 引言介绍application.yml(主配置文件)application-dev.yml(开发环境配置)application-test.yml(测试环境配置)application-prod.yml(生产环境配置)激活配置文件参考内容 引…...
php反序列化漏洞典型例题
1.靶场环境 ctfhub-技能树-pklovecloud 引用题目: 2021-第五空间智能安全大赛-Web-pklovecloud 2.过程 2.1源代码 启动靶场环境,访问靶场环境,显示源码:直接贴在下面: <?php include flag.php; class pks…...
浅析Android View绘制过程中的Surface
前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析,经过对整个App界面的View树进行遍历完成了测量和布局,确定了View的大小以及在屏幕中所处的位置。但是,如果想让用户在屏幕上看到…...
基于卷积神经网络的大豆种子缺陷识别系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 大豆种子缺陷识别系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷积神…...
HarmonyOS项目开发一多简介
目录 一、布局能力概述 二、自适应布局 三、响应式布局 四、典型布局场景 一、布局能力概述 布局决定页面元素排布及显示:在页面设计及开发中,布局能力至关重要,主要通过组件结构来确定使用何种布局。 自适应布局与响应式布局࿱…...
C++基础三
构造函数 构造函数(初始化类成员变量): 1、属于类的成员函数之一 2、构造函数没有返回类型 3、构造函数的函数名必须与类名相同 4、构造函数不允许手动调用(不能通过类对象调用) 5、构造函数在类对象创建时会被自动调用 6、如果没有显示声…...
利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析
利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析 引言 在2024年MathorCup大数据挑战赛中,赛道A聚焦于气象数据分析,特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…...
Linux系统操作篇 one -文件指令及文件知识铺垫
Linux操作系统入门-系统篇 前言 Linux操作系统与Windows和MacOS这些系统不同,Linux是黑屏的操作系统,操作方式使用的是指令和代码行来进行,因此相对于Windows和MacOS这些带有图形化界面的系统,Linux的入门门槛和上手程度要更高&…...
隨筆20241028 ISR 的收缩与扩展及其机制解析
在 Kafka 中,ISR(In-Sync Replicas) 是一组副本,它们与 Leader 保持同步,确保数据一致性。然而,ISR 的大小会因多种因素而变化,包括收缩和扩展。以下是 ISR 收缩与扩展的详细解释及其背后的机制…...
linux-字符串相关命令
1、cut 提取文件每一行中的内容 下面是一些常用的 cut 命令选项的说明: -c, --characters列表:提取指定字符位置的数据。-d, --delimiter分界符:指定字段的分隔符,默认为制表符。-f, --fieldsLIST:提取指定字段的数据…...
ES6 函数的扩展
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 参数变量是默认声明的,所以不能用 let 或 const 再次声明 使用参数默认值时,函数不能有同名参…...
Mac 查看占用特定端口、终止占用端口的进程
在 macOS 上,可以使用以下命令来查看占用特定端口(例如 8080)的进程: lsof -i :8080命令说明 lsof:列出打开的文件和网络连接信息。-i :8080:筛选出正在监听 8080 端口的进程。 输出结果结构 执行上述命…...
C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询
本文,分享 MyBatis 各种常用操作,不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节,我们使用 MyBatis Plus 实现了分页查询。除了这种方式,我们也可以使用 XML 实现分页查询。 这里,…...
RabbitMQ 安装(Windows版本)和使用
安装 安装包获取 可以自己找资源,我这里也有百度云的资源,如果没失效的话可以直接用。 通过百度网盘分享的文件:RabbitMQ 链接:https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码:fj79 安装教程…...
Apache paimon表管理
表管理 2.9.4.1 管理快照 1)快照过期 Paimon Writer每次提交都会生成一个或两个快照。每个快照可能会添加一些新的数据文件或将一些旧的数据文件标记为已删除。然而,标记的数据文件并没有真正被删除,因为Paimon还支持时间旅行到更早的快照。它们仅在快照过期时被删除。 …...
Frida安装后别急着‘玩’!这5个必做的环境验证与排错步骤你做了吗?
Frida安装后必做的5个环境验证与排错步骤 当你兴冲冲地按照教程安装完Frida和Server,准备开始"玩耍"时,却发现frida-ps -U毫无反应,或者遇到各种连接失败的问题。这种"安装成功却用不了"的尴尬,往往源于环境…...
java的for循环
public class Demo6 {public static void main(String[] args) {for (int money1;money<10;money){System.out.println("换一元纸币"money"张。换5角硬币"(10-money)*2"个");}} }public class Demo8 {public static void main(String[] args)…...
研华工控串口(RS232 RS485 RS422)针脚定义及接线示意图
一. 研华工控串口DB9针脚定义:二. 三种方式接线示意图:1.RS-232 模式(默认模式)点对点通讯,全双工,最长15米机器内DB9 外部RS-23…...
第 11 章 追踪与性能分析(OpenOCD)
第 11 章 追踪与性能分析 导读:现代 ARM 处理器内置了丰富的 CoreSight 追踪基础设施,包括 ETM 指令追踪、ITM/DWT 数据追踪、SWO/TPIU 追踪输出以及 SEGGER RTT 高速日志。本章将系统介绍如何在 OpenOCD 中配置和使用这些追踪功能,帮助开发者在不侵入目标程序的前提下,完成…...
多平台网络资源捕获工具:突破下载限制的技术实现与场景化应用
多平台网络资源捕获工具:突破下载限制的技术实现与场景化应用 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitc…...
Proxmox VE虚拟化实战:如何给MikroTik RouterOS配置PCI直通网卡(ROS 6.44.2实测)
Proxmox VE虚拟化实战:MikroTik RouterOS PCI直通网卡性能优化指南 在虚拟化环境中部署网络设备时,性能损耗一直是困扰技术人员的核心问题。当我们需要在Proxmox VE上运行MikroTik RouterOS作为软路由时,传统的virtio虚拟网卡方案往往无法满足…...
MATLAB App Designer实战:如何用按钮优雅终止死循环(附完整代码)
MATLAB App Designer实战:用按钮优雅控制循环的5个关键技巧 在MATLAB App Designer开发中,循环控制是每个开发者都会遇到的经典问题。想象一下这样的场景:你精心设计的界面正在运行一个数据处理循环,突然发现参数设置有误…...
告别两两配对!用Fast3R Transformer一次搞定1000张图的多视角重建(保姆级原理解读)
Fast3R Transformer:颠覆多视角重建的并行化革命 想象一下,你面前摆着1000张从不同角度拍摄的埃菲尔铁塔照片。传统方法需要将这些照片两两配对,进行数百万次重复计算,而Fast3R只需一次前向传播就能完成所有视角的联合重建——这就…...
Phi-4-Reasoning-Vision开源大模型实践:图文多模态输入格式与Phi-4模型要求对齐
Phi-4-Reasoning-Vision开源大模型实践:图文多模态输入格式与Phi-4模型要求对齐 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡RTX 4090环境优化。该工具严格遵循官方SYSTEM…...
Java: 手动实现DeepSeek R1工具调用,基于ReAct与Spring AI的实践指南
1. DeepSeek R1工具调用的现状与挑战 DeepSeek R1作为当前热门的开源大模型,在实际应用中经常会遇到需要调用外部工具的场景。但很多开发者在使用过程中发现,当前版本的DeepSeek R1并不支持原生的工具调用功能。这意味着当我们想让模型执行诸如查询天气、…...
