【前沿模型解析】潜在扩散模 1 | LDM第一阶段-感知图像压缩总览

news2024/11/17 8:30:48

文章目录

  • 0 开始~
  • 1 感知压缩的目的
  • 2 自回归编码器-解码器生成模型一览
    • 2.1 AE 自编码器
    • 2.2 VAE 变分自编码器
    • 2.3 VQ-VAE
    • 2.4 VQ-GAN
  • 3 代码部分讲解总览

0 开始~

从今天起呢,我们会剖析LDM(潜在扩散模型)

从去年开始,大量的生成模型涌现出来

而你如果在阅读系列文章的时候,发现很多都是基于扩散模型的~

那么LDM在扮演着一个什么角色呢?

我认为

  1. 开创性:他是AIGC领域非常重要的模型之一,他将图像生成带到了一个新的高度,为Stable Diffusion这类经典开源AIGC模型奠定了基础
  2. 综合性:同时他也是一个很综合的模型,网上很多一些博客将VAE,GAN,扩散模型这些生成模型分割开来,但是从某种意义来说,你在LDM里面可以同时见到三种模型的影子,也就是说他集成了三类模型的智慧,怪不得他这么强~
  3. 传递性:他也是一个承前启后的模型,前有DDPM,DDIM等工作带火了扩散模型,后有如潜在一致性模型(LCM),ControlNet等模型,深入了解这一部分内容,方便我们更好地去了解AIGC模型大家族~

那么学习过程中可能会遇到什么问题呢?

首先最重要的是网络结构本身复杂,再者代码也不容易看懂,LDM代码是通过包含着大量的动态导入包,Pytorch_lighting框架实现,不是我们所熟悉的pytorch框架,因而会对代码阅读造成更大的困难~

我会从理论到代码实践全方位剖析LDM,方便大家后续的学习~

LDM是两阶段模型

  • 第一阶段:对于图像进行压缩提取特征
  • 第二阶段:压缩后在隐空间上进行扩散

我们首先讲LDM的第一阶段(代码中往往看到first_stage即这个阶段)图片压缩,实现从像素空间到隐空间的转换

1 感知压缩的目的

首先回答最重要的一个问题

为什么要进行像素空间的压缩?

  • 同时压缩对应的可以减小之后扩散模型的计算量,高效快捷,原本像素空间比如是256*256*3 现在变成了16*16*3

具体怎么实现压缩的呢?

那就不得不提到我们的编码器-解码器家族系列了

2 自回归编码器-解码器生成模型一览

2.1 AE 自编码器

在这里插入图片描述

z = e ( x ) z=e(x) z=e(x)

AE (Auto-Encoder)即自编码器,是比较早提出进行图片压缩的

AE包含一个编码器和一个解码器。

训练时,输入图像 x x x会被编码成一个较短的向量 z z z,再被解码回和 x x x相同形状的 x ‾ \overline x x ,最小化 x x x x ‾ \overline x x 的差异,让重建出来的图像尽可能和原图相似 即 z = a r g m i n z ∣ ∣ x − x ‾ ∣ ∣ 2 z=argmin_z||x-\overline x||^2 z=argminz∣∣xx2

解码器部分可以看做压缩,那么编码器部分就是一个生成模型呀!

所以我们只要拿到一个向量 z z z,就可以得到一个图片

但是问题来了,解码器只认得从编码器来的向量,而不认识其他向量,导致解码器不能很好的进行随机生成图片

所以VAE就来了~

2.2 VAE 变分自编码器

AE距离生成图像就差一步,想一想,如果我们编码后的向量服从某一个规律,比如服从正态分布,那么这时候从这个正态分布随机采样一个向量,就可以生成图片了,这时候还可以生成一些多样的原本没有的图片

VAE就是如此

对于任意输入图像 x i x_i xi,VAE编码器会得到一个对应的均值和方差,对应的某一个正态分布就得到了

最后从这个正态分布采样得到隐变量 z z z传入生成器里面得到重构后的 x ‾ i \overline x_i xi 最小化 x x x x ‾ i \overline x_i xi 的差异,让重建出来的图像尽可能和原图 x i x_i xi相似

在这里插入图片描述

但是这里注意,如果我们就这样停止了,那么会有一个问题。模型为了恢复的更好,会将编码后的方差逐渐变为0(方差可以理解为噪声),这时候实际上就退化成了AE了,为了避免退化,VAE让编码后的向量尽可能服从0均值1方差

综上,接近标准正态分布的好处就是

1 我们可以从正态分布采样隐藏变量z,方便生成

2 避免退化为AE

训练完成后,我们就可以扔掉编码器,用来自标准正态分布的随机向量和解码器来实现随机图像生成了。

需要强调的是,VAE编码出来的向量是连续向量,也就是向量的每一维都是可能为任意小数,如1.154,1.342。如果把向量的某一维稍微改动那么一丢丢,解码器还是认得这个向量,并且会生成一张和原向量对应图片差不多的图片。

而之后的一些改进,如VQ-VAE就是离散的了,是量子化的,也就是说,只能是某些特定的离散的小数,比如1.1,1.2,1.3 不存在中间态

(科学空间有图)

2.3 VQ-VAE

VQ-VAE提出codebook,并且进行离散编码

为什么要离散编码?

有几个直观理解

  • 离散编码更自然,我们会说某一个人是男的还是女的,而不会说性别是0.5
  • 虽然自然界的各种信号不论是图像还是语言,他都是连续的,但当我们处理这些问题时,往往是将问题离散化后再进行处理,如图像划分成像素、语音也是经过抽样
  • 如果使用VAE的方式,样本的分布并不是很好学,VQ-VAE就使用了一个codebook去替代了VAE中学习样本分布的过程

预先生成一个离散数值的codebook,实际中可以通过(nn.Embedding实现)

我们假设codebook是 K × D K×D K×D 维的,其中 K K K 是指codebook的长度,一般设定为8192维,从0,1,2,3编号,而 D D D则是每一维向量的长度,一般设为512,codebook的长度 K K K可以简单的理解为codebook对应于 K K K个聚类中心。

1 将一张图片送入Encoder以后,会得到一个 H × W × D H×W×D H×W×D的 特征图 z e ( x ) z_e(x) ze(x)

2 将 H × W H×W H×W D D D维度向量和刚刚codebook的8192个分量计算相似度,找到最近的那一个分量的编号,最后可以得到 H × W H×W H×W的索引矩阵 q ( z ∣ x ) q(z|x) q(zx)

3 然后用索引对应向量去做替换原本的特征,得到新的特征图 p ( x ∣ z ) p(x|z) p(xz)该特征图作为Decoder的输入,最终通过Decoder得到重构后的图片。

在这里插入图片描述

离散向量的一个问题是它不好采样。回忆一下,VAE之所以把图片编码成符合正态分布的连续向量,就是为了能在图像生成时把编码器扔掉,让随机采样出的向量也能通过解码器变成图片。现在倒好,VQ-VAE把图片编码了一个离散向量,这个离散向量构成的空间是不好采样的。

这个问题是无解的。没错!VQ-VAE根本不是一个图像生成模型。它和AE一样,只能很好地完成图像压缩,把图像变成一个短得多的向量,而不支持随机图像生成。VQ-VAE和AE的唯一区别,就是VQ-VAE会编码出离散向量,而AE会编码出连续向量。

那怎么做生成?

就是通过其他网络,在压缩后的“小特征图”上做生成,比如用PixelCNN和扩散,生成后再用Decoder将“小特征图”翻译成最后的原图

轻松理解 VQ-VAE:首个提出 codebook 机制的生成模型 - 知乎 (zhihu.com)

VQ-VAE解读 - 知乎 (zhihu.com)

2.4 VQ-GAN

在VQ-VAE的损失函数的基础上

加入了对抗loss

在这里插入图片描述

当然,我们要注意:VQ-GAN也有重构损失,即也会缩小重构后的图像和原本的图像的差距~

详解VQGAN(一)| 结合离散化编码与Transformer的百万像素图像生成 - 知乎 (zhihu.com)

3 代码部分讲解总览

直接阅读的难点,我们刚刚提到了

网络结构本身复杂

所以我们给大家做了可视化

并且我们会从小到大依次给大家实现

先实现小的快,再实现更大的组件~

在这里插入图片描述

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

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

相关文章

数学建模-------MATLAB分支循环断点调试

1.if语句 (1)分段函数的引入(这里的数据表示的是分数的不同区间对应的等级) (1)这个就是一个十分简单的if语句,无论是if还是elseif后面都是不能添加任何分号的,这个例子就是一个分段的函数,在不…

基础总结篇:Activity生命周期

private int param 1; //Activity创建时被调用 Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate called.”); setContentView(R.layout.lifecycle); Button btn (Button) findViewById(R.id.…

医药行业痛点以及OKR解决方案

一、背景 随着医药行业的快速发展和市场竞争的加剧,企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地,某知名医药企业决定引入OKR(Objectives and Key Results,目标与关键成果)管理模式&#xff0…

Gradle入门初探

一、Gradle简介: 我们都创建过基于Maven的项目,maven可以很好的管理项目的依赖,编译和打包项目,Gradle是一个和Maven类似的自动化构建工具,Maven是基于xml文件格式,而Gradle是基于Groovy的语言&#xff0c…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持: ◆ 主流大型数据库Oracle、SQLServer、MyS…

Advanced RAG 01:讨论未经优化的 RAG 系统存在的问题与挑战

编者按: 自 2023 年以来,RAG 已成为基于 LLM 的人工智能系统中应用最为广泛的架构之一。由于诸多产品的关键功能严重依赖RAG,优化其性能、提高检索效率和准确性迫在眉睫,成为当前 RAG 相关研究的核心问题。 我们今天为大家带来的这…

【无标题】【Android】Android中Intent的用法总结

2.显示地图: Java代码 Uri uri Uri.parse(“geo:38.899533,-77.036476”); Intent it new Intent(Intent.Action_VIEW,uri); startActivity(it); 3.从google搜索内容 Java代码 Intent intent new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.pu…

SAP操作教程第16期:SAP B1关于审批模块的设置

工作效率是企业的生存之本,也是员工能够在企业中发展之本。自动化和规范化的审批流程可以减少手动操作以及沟通环节、节约时间和资源从而提高工作效率。 所以,今天我们就一起来了解一下SAP B1中关于审批模块的设置。 01关于审批模块的设置 第一步&#x…

数据结构基础:双链表结构、实现

继续和颦颦学C语言呀.......> 双链表的结构 这里的head 为头节点,是‘哨兵位’,实际不存储任何有效的数据 它的存在是为了遍历环链表避免死循环 双链表的实现 typedef int LTDataType; typedef struct ListNode { struct ListNode* next; //指针保存…

为什么使用MQ????

1、异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式。 串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是…

2024/4/1—力扣—二叉树的最近公共祖先

代码实现: 思路: 递归判断左子树和右子树,查找p或者q是否在当前节点的子树上 1,在同一子树上,同一左子树,返回第一个找到的相同值,同一右子树上,返回第一个找到的相同值 2&#xff0…

【每日刷题】Day4

【每日刷题】Day4 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 目录 1. 83. 删除排序链表中的重复元素 - 力扣(LeetCode) 2. 88. 合并两个有序数组 - 力扣(LeetCode&…

Windows SDK(六)组合框与列表框控件

组合框和列表框同样也是控件,所以我们在应用组合框和列表框时同样也需要父窗口,现在我们以 创建项目时程序自行创建的窗口作为父窗口展开如下的控件创建与应用 在进行组合框与列表框的讲解前,我们首先在程序中定义几个宏作为我们在编写程序…

C语言:顺序表专题

目录 一、数据结构之顺序表/链表1.数据结构相关概念1.1什么是数据结构1.2为什么需要数据结构 二、顺序表1.顺序表的概念及结构2.顺序表分类3.动态顺序表的实现 一、数据结构之顺序表/链表 1.数据结构相关概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来…

【优选算法专栏】专题十六:BFS解决最短路问题(一)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

云his系统源码 java源码saas模式 二甲医院his系统全套源码 数据库MySQL + MyCat

基层医院云HIS系统源码 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能,还能与公卫、PACS等各类外部系统融合&…

0基础学习python

0基础如何进入IT行业? 建议先掌握以下: 编程环境的安装和使用输出输入语句、变量、表达式的理解和使用选择结构、循环结构的理解和使用列表的使用文件的操作函数的调用库的安装和使用 编程,其实就是利用特定的语言控制计算机、或者就是与计算…

如何把音乐播放速度慢下来?享受慢音乐的两个方法

一,前言 在现代社会,我们生活在一个快节奏的环境中,时间仿佛被压缩成了碎片,每个人都在匆匆忙忙地追求着速度和效率。然而,有时放慢脚步,让心灵回归宁静,成为了一种难得的奢侈。 音乐&#xf…

民航电子数据库:在有分组统计的语句中,输出表达式含有非分组统计项

目录 一、场景二、报错信息三、排查四、原因五、解决 一、场景 1、对接民航电子数据库 2、执行SQL语句报错 二、报错信息 三、排查 查看数据库def_group_by_mode配置 show def_group_by_mode四、原因 def_group_by_mode设置为0导致,相当于mysql的sql_modeonly_…

NatCross实现NASCAB云可云内网穿透指南

一、简介 1、NAS_CAB介绍 跨平台NAS软件,远程管理照片,影音和文件,无需专用设备,个人版永久免费。官网地址:https://www.nascab.cn/。 2、NatCross介绍 NatCross是内网穿透工具,也是免费的端口映射和DDNS动态域名解析软件。软件从2021年上线以来&…