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

文章目录

  • 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.rhkb.cn/news/300117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内ChatGPT大数据模型

在中国,随着人工智能技术的迅猛发展,多个科技公司和研究机构已经开发出了与OpenAI的ChatGPT类似的大型语言模型。这些模型通常基于深度学习技术,尤其是Transformer架构,它们在大量的文本数据上进行训练,以理解和生成自…

Thinkphp5萤火商城B2C小程序源码

源码介绍 Thinkphp5萤火商城B2C小程序源码,是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。采用稳定的MVC框架开发,执行效率、扩展性、稳定性值得信赖。 环境要求 Nginx/Apache/IIS PHP5.4 MySQL5.1 建议使用环境&#xff…

APP渗透总结

APP渗透测试和Web渗透测试本质上没有区别。目前APP应用主要分为Android和IOS,但是由于苹果的IOS操作系统不开源,所以一般对IOS系统进行渗透和反编译会比较困难,所以一般对APP系统进行渗透测试都是对Android进行测试。 目录 安装安卓模拟器抓…

C语言解决汉诺塔问题

背景 首先带大家了解一下汉诺塔问题 汉诺塔是一个典型的函数递归问题,汉诺塔描述了这样的场景,有三个柱子,A,B,C,A柱为起始柱,在A柱上面有若干大小不同的盘子,最下面的最大,最上面的最小&#x…

基于Spring Boot的职称评审管理系统

基于Spring Boot的职称评审管理系统 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 部分系统展示 前台首页界面 用户注册登录界面 管理员登录界面 个人中心界面…

学习大数据之JDBC(使用JAVA语句进行SQL操作)(3)

文章目录 DBUtils工具包准备工作DBUtils的介绍QueryRunner空参的QueryRunner的介绍以及使用有参QueryRunner的介绍以及使用 ResultSetHandler结果集BeanHandler<T>BeanListHandler<T>ScalarHanderColumnListHander 事务事务事务_转账分析图实现转账&#xff08;不加…

搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用 有向无环图一定存在拓扑序列&#xff08;有向无环图又被称为拓扑图&#xff09;&#xff0c;有向有环图一定不存在拓扑序列。无向图没有拓扑序列。 拓扑序列&#xff1a;将一个图排成拓扑序后&#xff0c;所有的边都是从前指…

Redis的高可用(主从复制、哨兵模式、集群)的概述及部署

目录 一、Redis主从复制 1、Redis的主从复制的概念 2、Redis主从复制的作用 ①数据冗余&#xff1a; ②故障恢复&#xff1a; ③负载均衡&#xff1a; ④高可用基石&#xff1a; 3、Redis主从复制的流程 4、Redis主从复制的搭建 4.1、配置环境以及安装包 4.2所有主机…

智慧InSAR专题———模拟数据实现现实场景异常形变点识别(论文解读)

文章目录 &#xff08;近期想静下心回顾近期看的佳作&#xff0c;会写一下自己的总结&#xff0c;大家如果对此系列感兴趣&#xff0c;每周踢一下我&#xff0c;周更&#xff0c;持续更新&#xff09;0 前言1 Automated deformation detection and interpretation using InSAR …

蓝桥杯练习系统(算法训练)ALGO-959 P0705 集合运算

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 输入两个整数集合A、B&#xff0c;求出他们的交集、并集以及B在A中的余集。交集、并集和余集的计算都要求写成一个单独的函数。   输…

分类预测 | Matlab实现DRN深度残差网络数据分类预测

分类预测 | Matlab实现DRN深度残差网络数据分类预测 目录 分类预测 | Matlab实现DRN深度残差网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现DRN深度残差网络数据分类预测&#xff08;完整源码和数据&#xff09;&#xff0c;运行环境为Matl…

Java spring 01 (图灵)

01.依赖注入 这里两个方法用到了datasource方法&#xff0c;不是bean这样的使用&#xff0c;没有autowird 会创建两个datasource configuration 会运行代理模式 会产生一个AppConfig的代理对象 这个代理对象会在spring的容器先找bean&#xff0c;datasource此时已经创建了be…

【前沿模型解析】潜在扩散模型 2-1 | 手撕感知图像压缩 基础块ResNet块

文章目录 1 残差结构回顾2 LDM结构中的残差结构设计2.1 组归一化GroupNorm层2.2 激活函数层2.3 卷积层2.4 dropout层 3 代码实现 1 残差结构回顾 残差结构应该是非常重要的基础块之一了&#xff0c;你肯定会在各种各样的网络模型结构里看到残差结构&#xff0c;他是非常强大的…

Python实现【坦克大战】+源码分享

写在前面&#xff1a; 坦克大战&#xff0c;这款经典的电子游戏&#xff0c;无疑是许多80后和90后心中不可磨灭的童年记忆。它不仅仅是一款游戏&#xff0c;更是那个时代科技娱乐方式的缩影&#xff0c;见证了电子游戏行业的起步与发展。 在那个电脑和网络尚未完全普及的年代…

【Linux】进程控制详解

目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

我的xml文件名称叫w2101.xml 第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步…

python开发poc2

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

vue想要突破全局样式限制又不影响别的页面样式怎么办

<!-- 用scope盖不住全局&#xff0c;随意来个class匹配私定&#xff0c;搜索关键词&#xff1a;不要随便改&#xff0c;乱打class名 --> <style> .lkajsdfjkalsfhkljashkflhaskl .el-input.el-input--default.el-input--suffix { width: 160px !important; } …

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…

部署k8s客户端,及docker私仓部署

1.部署一个docker私仓 mkdir /opt/docker/registry #配置仓库密码 mkdir /opt/docker/auth cd /opt/docker/auth htpasswd -Bbn admin admin > htpasswd#运行docker私仓服务&#xff0c;下面端口5000:5000 前面的5000对应本机端口可以自定义 docker run -itd \ -v /opt/d…