Stable Diffusion1.5网络结构-超详细

这篇具有很好参考价值的文章主要介绍了Stable Diffusion1.5网络结构-超详细。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 Unet

1.0 介绍 

1.1详细整体结构

1.2 缩小版整体结构

1.3 时间步编码

1.4 CrossAttnDownBlock2D

1.4.1 ResnetBlock2D

1.4.2 Transformer2DModel

1.4.2.1 BasicTransformerBlock

1.4.2.1.1 SelfAttention

1.4.2.1.2 CrossAttention

1.4.2.1.3 FeedForward

1.4.3 DownSample2D

1.5 DownBlock2D

1.6 UnetMidBlock2DCrossAttn

1.7 UpBlock2D

1.7.1 UpSample2D

1.8 CrossAttnUpBlock2D

2 VAE

2.0 介绍

2.1 AE

2.2 VAE

2.3 整体结构 

2.4 DownEncoderBlock2D

2.4.1  ResnetBlock2D

2.4.2 UpSample2D

2.5 UnetMidBlock2D

2.6 Sample

2.7 UpDecoderBlock2D

 2.7.1  UpSample2D

3 CLIP

3.1  CLIPTextEmbeddings

3.2  CLIPEncoderLayer


绘制软件:ProcessOn,以下图片保存可高清查看

1 Unet

1.0 介绍 

        负责预测噪声

1.1详细整体结构

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.2 缩小版整体结构

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.3 时间步编码

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4 CrossAttnDownBlock2D

每个ResnetBlock2D的输入有两个

1,一个是来自上一层的输出lattent,

2,另一个来自时间步编码模块的输出time_embeds ( shape=[2, 1280], 后面省略说明,默认[2, 1280]这种写法是tersor的形状)

每个Transformer2DModel输入有两个

1,上一层的输出

2, CLIP text_encoder的文本编码text embedding,或者叫提示词编码prompt embedding,其shape=[2, 77, 768]

后面凡是有ResnetBlock2D和Transformer2DModel的模块,其输入形式都是如此,为了方便,后面有些模块的time_embeds和prompt  embedding这两个输入就默认不画了,例如UnetMidBlock2DCrossAttn、UpBlock2D、CrossAttnUpBlock2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.1 ResnetBlock2D

需要注意的点

1, ResnetBlock2D的输入有两个,一个是来自上一层的lattent,另一个来自时间步编码模块的输出time_embeds ( shape=[2, 1280], 后面省略说明,默认[2, 1280]这种写法是tersor的形状)

2, Conv3x3和Linear的输入输出Channel,不同层会不一样

3, 输入输出通道数不一致的时候,残差连接会用一个1x1的卷积

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.2 Transformer2DModel

Transformer2DModel输入有两个

1,上一层的输入

2, CLIP text_encoder的文本编码text embedding,或者叫提示词编码prompt embedding,其shape=[2, 77, 768]

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.2.1 BasicTransformerBlock

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.2.1.1 SelfAttention

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.2.1.2 CrossAttention

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.2.1.3 FeedForward

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.4.3 DownSample2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.5 DownBlock2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.6 UnetMidBlock2DCrossAttn

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.7 UpBlock2D

UNet右边部分的ResnetBlock2D模块,其输入除了有来自上一层的输出和time_embedd之外,还有自UNet左边部分输入,具体做法是将上一层的输出和UNet左边部分输入进行concat之后送进ResnetBlock2D模块,然后和time_embedd相加,后面的CrossAttnUpBlock2D也是如此,具体查看1.1 详细整体结构

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.7.1 UpSample2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

1.8 CrossAttnUpBlock2D

注意, 最后一个CrossAttnUpBlock2D没有UpSample2D模块,该模块具体输入输出shape看1.1 详细整体结构

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2 VAE

2.0 介绍

将扩散过程从512x512的图像空间映射降维到64x64的潜空间,内存和运算量减小64倍

2.1 AE

注意:下面说的特征向量,编码向量,潜变量,code是同一个意思

普通的自编码器,分为编码器和解码器,编码器Encoder负责将编码图像,把图像从高维映射到低维,得到特征向量,例如把3x512x512的图像编码成4x64x64的特征向量,这个特征向量可以表示原始图像,包含原始图像的特征,比如颜色,纹理等其他抽象特征,解码器Decoder负责把低维的特征向量还原回原始图像.但这种编码是固定的,一张图片只能编码成一个固定的向量,反过来,解码也是唯一的,一个固定的编码向量只会被解码成一张确定的图像,如果来一张你训练集没见过的图片,对其编码后再解码,生成的图像大概率是个无意义的图像,因此AE是一个单值映射关系,潜变量(即编码向量)具有不连续性,潜变量是确定性值,选择一个随机的潜在变量可能会产生垃圾输出,潜在空间缺乏生成能力(即潜空间不是所有的潜变量都是有效的),

举个李宏毅老师的例子:

假设我们训练好的AE将“新月”图片encode成code=1(这里假设code只有1维),将其decode能得到“新月”的图片;将“满月”encode成code=10,同样将其decode能得到“满月”图片。这时候如果我们给AE一个code=5,我们希望是能得到“半月”的图片,但由于之前训练时并没有将“半月”的图片编码,或者将一张非月亮的图片编码为5,那么我们就不太可能得到“半月”的图片。

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

其他博客解释:

        AE的Encoder是将图片映射成“数值编码”,Decoder是将“数值编码”映射成图片。这样存在的问题是,在训练过程中,随着不断降低输入图片与输出图片之间的误差,模型会过拟合,泛化性能不好。也就是说对于一个训练好的AE,输入某个图片,就只会将其编码为某个确定的code,输入某个确定的code就只会输出某个确定的图片,并且如果这个code来自于没见过的图片,那么生成的图片也不会好。

        自动编码器是数据相关的(data-specific 或 data-dependent),这意味着自动编码器只能压缩那些与训练数据类似的数据,反过也是一类数据对应一种编码器,无法拓展一种编码器去应用于另一类数据。

2.2 VAE

而VAE不是将图像编码成一个固定的值,而是编码成一个连续的分布,这样,只要满足这个分布,我就能重建原始图像,满足这个分布的值会有很多,不再是一个固定的code了,例如,我把编码器的输出约束成一个标准正态分布,重建图像我只需要从标准正态分布采样在送到就解码器即可,

这里其实不一定非得要是标准正态分布,只要是连续的分布理论上都可以,但由于标准正态分布有良好的性质:1,高维正态分布采样的向量模长近似一致,两两近似正交,两点之间的欧式距离与期望值近似,这是一个很好的约束,对模型的学习有利;2,良好的数学性质,但你对多个分布进行运算时(像Diffusion),正态分布会带来很大的便利,可以通过标准化,变换等方式处理,便于模型的训练和优化;3,用标准正态分布对潜变量进行建模,能利用正态分布的性质进行随机采样和重构(重参数化)

举个例子:来自https://www.cnblogs.com/amazingter/p/14686450.html

针对上面的半月问题,我们转变思路,不将图片映射成“数值编码”,而将其映射成“分布”。我们将“新月”图片映射成μ=1的正态分布,那么就相当于在1附近加了噪声,此时不仅1表示“新月”,1附近的数值也表示“新月”,只是1的时候最像“新月”。将"满月"映射成μ=10的正态分布,10的附近也都表示“满月”。那么code=5时,就同时拥有了“新月”和“满月”的特点,那么这时候decode出来的大概率就是“半月”了。这就是VAE的思想。

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

关于VAE还可以参考【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)_vae的作用-CSDN博客

写的很好,接下来正式上图

2.3 整体结构 

由于csdn查看大图很捞,可双击另存为查看高清大图

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.4 DownEncoderBlock2D

注意:VAE的ResnetBlock2D模块是没有时间步的输入的,即time_embeds=None, 其他的和上面Unet中的ResnetBlock2D一致

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.4.1  ResnetBlock2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.4.2 UpSample2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.5 UnetMidBlock2D

SelfAttention参考Unet中的

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.6 Sample

重参数化技巧:

现在均值mean和方差var(实际是log方差,这里先以方差为例)是网络的输出,也就是现在编码器的输出服从N~(mean, var)这个正态分布,我们要从这个正态分布采样出一个样本,送进解码器,这个样本是服从N~(mean, var)正态分布的,但采样这个操作是不可导的,采样操作是指从某个概率分布中随机抽取样本的过程,因为梯度是损失函数关于模型参数的变化率,而采样操作的非确定性使得无法直接计算关于参数的精确梯度。如果将采样操作视为一个具有参数的函数,并尝试计算其导数,通常会遇到两个问题:

  1. 不可导性: 由于采样操作引入了离散性和不可导性,它们在大多数情况下是不可导的。导数描述的是函数在某一点上的变化率,而采样操作在这方面表现得很突变和不连续,因此没有明确定义的导数。

  2. 梯度的方差: 即使我们忽略不可导性,尝试使用梯度信息来更新参数,由于采样引入的随机性,梯度的方差可能会非常高,导致不稳定的优化过程。

所以无法对mean和var求偏导,因为这里mean和var就是网络的参数,这个时候可以从标准正态分布N(0,1)采样一个sample(一般会用概率密度的分布函数去采样), 这个时候sample就是一个确定的值,把sample当成常数,std是标准差,等于var开根号

令z=mean + sample * std,这个时候z就可以对mean和std求偏导了,z就等价从N~(mean, var)这个分布采样,可以对z求期望和方差,根据高斯分布的性质以及期望和方差的公式,能得出z也服从正态分布,切均值=mean, 方差=std的平方=var,这样做其实是把随机性转移到了sample这个常数

但代码里是log方差,是因为方差是正的,加log让它取值范围也能取负值,这样就不用加激活函数了,所以后面再用exp还原方差

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

2.7 UpDecoderBlock2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

 2.7.1  UpSample2D

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

3 CLIP

CLIP这里用到的是文本编码器,结构如下

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

3.1  CLIPTextEmbeddings

灰色的框框text_inoputs和embedding不是操作,是表示输入输出

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion

3.2  CLIPEncoderLayer

CLIPEncoderLayer就是普通的Transformer的Encoder层了

Stable Diffusion1.5网络结构-超详细原创,2023AIGC,stable diffusion文章来源地址https://www.toymoban.com/news/detail-758735.html

到了这里,关于Stable Diffusion1.5网络结构-超详细的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mask RCNN网络结构以及整体流程的详细解读

    Mask RCNN是在Faster RCNN的基础上增加了mask head用于实例分割的模型。 总体来说,Mask RCNN网络结构可以分为: BackBone(ResNet+FPN) — RPN网络(Region Proposal Network) — ROI Head(ROIAlign + cls head + bbox head + mask head) 整体网络结构如下(来自原论文https://arxiv.org/pdf/1703.06870.pdf): Backbone主要由R

    2024年02月13日
    浏览(40)
  • 一文详细理解计算机网络体系结构(考试和面试必备)

    1.1 计算机网络的概念 最 简 洁 的 定 义 color{#0000FF}{最简洁的定义} 最 简 洁 的 定 义 :计算机网络就是一些互连的,自治的计算机系统的集合。 广 义 观 点 的 定 义 color{#0000FF}{广义观点的定义} 广 义 观 点 的 定 义 :计算机网络是 能实现远程信息处理的系统 或 能进一步

    2023年04月08日
    浏览(53)
  • 计算机网络——第一章体系结构相关习题及详细解析

    在OSI参考模型中,自下而上第一个提供端到端服务的层次是: A.数据链路层        B.传输层        C.会话层        D.应用层 答案选择: B.传输层 即, 在OSI参考模型中,自下而上第一个提供端到端服务的层次是传输层。  解析 为了解决这道题,我们首先要了解OSI体系结构

    2024年02月08日
    浏览(48)
  • 简单有趣的轻量级网络 Shufflenet v1 、Shufflenet v2(网络结构详解+详细注释代码+核心思想讲解)——pytorch实现

         这期博客咱们来学习一下Shufflenet系列轻量级卷积神经网络,Shufflenet v1 、Shufflenet v2。 本博客代码可以直接生成训练集和测试集的损失和准确率的折线图,便于写论文使用。 论文下载链接: Shufflene系列轻量级卷积神经网络由旷世提出,也是非常有趣的轻量级卷积神经网

    2024年02月01日
    浏览(48)
  • YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

    在上一篇中,我们简单介绍了YOLOv5的配置文件之一 yolov5s.yaml ,这个文件中涉及很多参数,它们的调用会在这篇 yolo.py 和下一篇 common.py 中具体实现。 本篇我们会介绍 yolo.py ,这是YOLO的特定模块,和网络构建有关。 在 YOLOv5源码中,模型的建立是依靠 yolo.py 中的函数和对象完

    2023年04月15日
    浏览(78)
  • YOLOv5源码逐行超详细注释与解读(7)——网络结构(2)common.py

    上一篇我们一起学习了YOLOv5的网络模型之一 yolo.py ,它这是YOLO的特定模块,而今天要学习另一个和网络搭建有关的文件—— common.py ,这个文件存放着YOLOv5网络搭建常见的通用模块。如果我们需要修改某一模块,那么就需要修改这个文件中对应模块的定义。 学这篇的同时,搭

    2023年04月16日
    浏览(47)
  • YOLOv7-tiny网络结构图及yaml文件 详细备注

    池化层,默认表示两倍下采样, 就是表示Conv+BN+LeakyReLU [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]] 结构图 yaml yaml文件中如下表示,直接看最后一层输出通道数,尺寸不会变化,SP模块默认设置卷积Pading为卷积核的一半大小 构建代码 yaml文件中的SP表示如下 结构图 yaml文件表示

    2024年02月03日
    浏览(69)
  • SE、CBAM、ECA注意力机制(网络结构详解+详细注释代码+核心思想讲解+注意力机制优化神经网络方法)——pytorch实现

           这期博客我们来学习一下神秘已久的注意力机制,刚开始接触注意力机制的时候,感觉很有意思,事实上学会之后会发现比想象中的要简单,复杂的注意力机制后续会讲解,这期博客先讲解最常见的三种SE、CBAM、ECA注意力机制。        注意力机制更详细的可以被称

    2024年02月07日
    浏览(49)
  • 【网络安全】数据加密标准(DES算法)详细介绍( 分组密码、Feistel密码结构、轮函数、子密钥生成算法)

    将被加密明文划分成一个一个的分组,输入n比特明文分组,输出n比特密文分组。 若映射可逆,具有 x n ! x^n! x n ! 种替换可能性。 如以下示例,每个4比特输入唯一映射为另一个4比特输出。 2.1 什么是Feistel密码结构 1973年由 IBM的Horst Feistel首次提出 ,通过将明文分组分成 左右

    2023年04月08日
    浏览(43)
  • YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml(包括源码+网络结构图)

    前言: Hello大家好,我是小哥谈。 配置文件yolov5s.yaml在YOLOv5模型训练过程中发挥着至关重要的作用,属于初学者必知必会的文件!在YOLOv5-6.0版本源码中,配置了5种不同大小的网络模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5n是网络深度和宽度最小但检测速度

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包