diffusion model(3) 扩散模型去噪推理原理 solver

在之前的篇章中,以huggingface为例,分析了模型在训练阶段,是如何加噪声,以及用unet预测噪声的。接下来以开源代码diffusers为例,分析扩散模型在去噪推理时的原理。

在阅读这篇文章前,读者需要先了解DDPM、LDM和stable diffusion model的原理。否则阅读会吃力。

以StableDiffusionXLInpaintPipeline为例,其__call__函数有如下,可以得到两个信息:

  1. unet会以时间步t的latent matrix为输入,预测噪声,噪声的形状与输入相同。
  2. self.scheduler.step会根据时间步t的latent matrix和预测的噪声,以某个权重相减,得到时间步t-1的latent matrix。后者可以作为下个循环的输入。
with self.progress_bar(total=num_inference_steps) as progress_bar:for i, t in enumerate(timesteps):...noise_pred = self.unet(latent_model_input,t,encoder_hidden_states=prompt_embeds,timestep_cond=timestep_cond,cross_attention_kwargs=self.cross_attention_kwargs,added_cond_kwargs=added_cond_kwargs,return_dict=False,)[0]...latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0]...

深入方法self.scheduler.step的调用,此处实现为DPMSolverMultistepScheduler,这里会进入dpm_solver_first_order_update。

def step(self,model_output: torch.Tensor,timestep: int,sample: torch.Tensor,generator=None,variance_noise: Optional[torch.Tensor] = None,return_dict: bool = True,
) -> Union[SchedulerOutput, Tuple]:...if self.config.solver_order == 1 or self.lower_order_nums < 1 or lower_order_final:prev_sample = self.dpm_solver_first_order_update(model_output, sample=sample, noise=noise)elif self.config.solver_order == 2 or self.lower_order_nums < 2 or lower_order_second:prev_sample = self.multistep_dpm_solver_second_order_update(self.model_outputs, sample=sample, noise=noise)else:prev_sample = self.multistep_dpm_solver_third_order_update(self.model_outputs, sample=sample)if self.lower_order_nums < self.config.solver_order:self.lower_order_nums += 1...return SchedulerOutput(prev_sample=prev_sample)

继续深入实现,可以看出:sovler有"dpmsolver++"等四种选型。简单来看,"dpmsolver++"和"dpmsolver"都是以某种权重比例让该时间步t的latent matrix减去预测噪声,而"sde-dpmsolver++"和"sde-dpmsolver"还会再加一个随机噪声(只是比例可能较小)。

    def dpm_solver_first_order_update(self,model_output: torch.Tensor,*args,sample: torch.Tensor = None,noise: Optional[torch.Tensor] = None,**kwargs,) -> torch.Tensor:"""One step for the first-order DPMSolver (equivalent to DDIM).Args:model_output (`torch.Tensor`):The direct output from the learned diffusion model.sample (`torch.Tensor`):A current instance of a sample created by the diffusion process.Returns:`torch.Tensor`:The sample tensor at the previous timestep."""timestep = args[0] if len(args) > 0 else kwargs.pop("timestep", None)prev_timestep = args[1] if len(args) > 1 else kwargs.pop("prev_timestep", None)# 省略部分代码...sigma_t, sigma_s = self.sigmas[self.step_index + 1], self.sigmas[self.step_index]alpha_t, sigma_t = self._sigma_to_alpha_sigma_t(sigma_t)alpha_s, sigma_s = self._sigma_to_alpha_sigma_t(sigma_s)lambda_t = torch.log(alpha_t) - torch.log(sigma_t)lambda_s = torch.log(alpha_s) - torch.log(sigma_s)h = lambda_t - lambda_sif self.config.algorithm_type == "dpmsolver++":x_t = (sigma_t / sigma_s) * sample - (alpha_t * (torch.exp(-h) - 1.0)) * model_outputelif self.config.algorithm_type == "dpmsolver":x_t = (alpha_t / alpha_s) * sample - (sigma_t * (torch.exp(h) - 1.0)) * model_outputelif self.config.algorithm_type == "sde-dpmsolver++":assert noise is not Nonex_t = ((sigma_t / sigma_s * torch.exp(-h)) * sample+ (alpha_t * (1 - torch.exp(-2.0 * h))) * model_output+ sigma_t * torch.sqrt(1.0 - torch.exp(-2 * h)) * noise)elif self.config.algorithm_type == "sde-dpmsolver":assert noise is not Nonex_t = ((alpha_t / alpha_s) * sample- 2.0 * (sigma_t * (torch.exp(h) - 1.0)) * model_output+ sigma_t * torch.sqrt(torch.exp(2 * h) - 1.0) * noise)return x_t

参考阅读:

  • DDIM
  • 从DDIM到DPM-solver++

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550494.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式-命令】

定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使您能够使用不同的请求、排队请求或记录请求&#xff0c;并支持可撤销的操作。该模式通过将请求与其执行分离&#xff0c;使得请求者和接收者之间…

第十四周学习周报

目录 摘要Abstract1. LSTM的代码实现2. 序列到序列模型3. 梯度与方向导数总结 摘要 在上周的学习基础之上&#xff0c;本周学习的内容有LSTM的代码实现&#xff0c;通过对代码的学习进一步加深了对LSTM的理解。为了切入到transformer的学习&#xff0c;本文通过对一些应用例子…

AGI时代存内计算芯片的语音识别之旅 —— 知存科技开发板体验与感悟

目录 一、简介 二、活动内容 2.1 多模态时代&#xff0c;存内计算框架的应用与发展 1、多模态时代计算需求 2、存内计算技术 3、知存科技存内产品 2.2 分布式环境下深度学习任务的高效可靠执行研究 基于强化学习的流水线分布式训练调度方案&#xff08;PG-MPSS&#xf…

前端工程规范-4:Git提交前代码规范检查(Husky + Lint-staged)

Git提交前代码规范检查 在前端项目开发中&#xff0c;规范git提交信息&#xff0c;也是经常使用的手段&#xff0c;如何确保团队成员都遵循ESint规则&#xff0c;且不会将不符合规范的代码推送到Git仓库&#xff1f; 答案是&#xff1a;使用带有git hooks功能的husky。git hoo…

【LLM大模型】Ollama 运行 GGUF 模型

Ollama 默认直接支持很多模型&#xff0c;只需要简单的使用 ollama run命令&#xff0c;示例如下&#xff1a; ollama run gemma:2b就可安装、启动、使用对应模型。 通过这样方式直接支持的模型我们可以通过https://ollama.com/library 找到。 在https://huggingface.co/mod…

大端、小端区分与判断

大小端的判断是根据系统如何存储二进制数据来判断的 大端顾名思义&#xff0c;以数据的高位做开端的操作系统、小端也是以数据的低位做开端的操作系统 用最简单的例子&#xff1a; 对于数据0x01来说&#xff0c;高位为0低位为1&#xff0c;转十进制&#xff1a; 0x01 0 * 1…

RK3588主板PCB设计学习(五)

DDR中的一组信号线如何进行走线&#xff1a; 高亮这一组的焊盘&#xff0c;按照DDR4的走线要求&#xff0c;TOP层贴元器件的话从最下面的层开始走线&#xff1a; 先行CPU这一端把线拉出来&#xff0c;怎么顺怎么拉&#xff1a;如果在第六层拉不出来的话&#xff0c;在表层进行…

STM32DMA学习日记

STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器&#xff08;DMA_ISR&#xff09;4.2 DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09;…

[CSP-J 2022] 解密

题目来源&#xff1a;洛谷题库 [CSP-J 2022] 解密 题目描述 给定一个正整数 k k k&#xff0c;有 k k k 次询问&#xff0c;每次给定三个正整数 n i , e i , d i n_i, e_i, d_i ni​,ei​,di​&#xff0c;求两个正整数 p i , q i p_i, q_i pi​,qi​&#xff0c;使 n …

verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)

在以往采用 FPGA 实现的 FIR 滤波功能&#xff0c;滤波器系数是通过 matlab 计算生成&#xff0c;然后作为固定参数导入到 verilog 程序中&#xff0c;这尽管简单&#xff0c;但灵活性不足。在某些需求下&#xff08;例如捕获任意给定台站信号&#xff09;需要随时修改滤波器的…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版&#xff0c;可自行搜索。&#xff08;pd虚拟机里运行黑神话估计够呛的&#xff09; 2、运行CrossOver&#xf…

12、echarts 没有显示折线图

一、问题描述 echarts 没有显示折线图&#xff0c;但是&#xff0c;有数据显示&#xff1a; 看图表展示&#xff0c;y轴数据全部没有显示&#xff0c;直接可以判定是数据结构出问题了。 检查 series.data[] 数据结构&#xff1a; dataList [{"dateStr":"202…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发3)】传感器服务

场景介绍 当设备需要获取传感器数据时&#xff0c;可以使用sensor模块&#xff0c;例如&#xff1a;通过订阅方向传感器数据感知用户设备当前的朝向&#xff0c;通过订阅计步传感器数据统计用户的步数等。 函数说明 名称描述OH_Sensor_GetInfos(Sensor_Info **infos, uint32…

GAMES101(作业8)

作业8 题目&#xff1a; 模拟绳子动画&#xff0c;包括基于物理的&#xff0c;和非物理的&#xff0c;应该修改的函数是:rope.cpp 中的void Rope::simulateEuler(... Rope::rope(...)&#xff0c;&#xff0c;void Rope::simulateVerlet(...) 代码框架&#xff1a; main:负…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码&#xff1a;〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】&#xff0c;并动画演示〕》&#xff0c;VS2015调试Exata&#xff0c;跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

Redis-常见数据类型(修改ing)

1. 预备知识 redis按照键值对的方式存储数据 1.1 基本全局命令 KEYS 返回所有满⾜样式&#xff08;pattern&#xff09;的key,⽀持如下统配样式: h?llo 匹配hello,hallo,hxlloh*llo 匹配hllo,heeeelloh[ae]llo 只匹配hallo helloh[^e]llo 匹配除hello,heee..llo以外的h[a…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录&#xff1a; ❄️一、哈希表&#xff1a; ☑ 1、概念&#xff1a; ☑ 2、冲突-概念&#xff1a; ☑ 3、冲突-避免&#xff1a; ☞ 1&#xff09;、避免冲突-哈希函数的设计&#xff1a; ☞ 2&#xff09;、避免冲突-负载因子调节(重点)&#xff1a; ☑ 4、冲突-解决&…

宠物空气净化器该怎么选?希喂、美的、有哈这三款有推荐的吗?

终于要到国庆了&#xff0c;这可是打工人除春节外最长的假期&#xff01;在外上班后&#xff0c;回家的次数越来越少了&#xff0c;这次国庆肯定要回去陪陪父母。这票是真难买啊&#xff0c;候补了我一个多星期才买到。本来以为最困难的问题已经解决了&#xff0c;又想到我家猫…

有通话质量更好的蓝牙耳机推荐吗?高品质的平价开放式耳机推荐

个人认为开放式耳机在通话方面还是表现不错的&#xff0c;主要有以下几个原因&#xff1a; 首先&#xff0c;在麦克风设计与配置方面&#xff1a; 拥有高品质麦克风硬件。优质的开放式耳机往往会配备高性能的麦克风&#xff0c;这些麦克风灵敏度较高&#xff0c;能够精准地捕捉…

情感短视频素材下载推荐

在制作热门的情感短视频时&#xff0c;优质的素材是不可或缺的。作为一名资深视频剪辑师&#xff0c;今天我将为你推荐几个可以下载高清无水印情感视频素材的网站&#xff0c;助你轻松找到创作灵感。 蛙学网 蛙学网是国内领先的视频素材平台&#xff0c;专注于情感和治愈类视频…