介绍Stable Diffusion是文生图模型包括三个大组件VAEClip和Unet。原理分析1.Unet的详细结构上面两张图对应着看Unet包含三大部分①下采样三个cross attention下采样模块CrossAttnDownBlock2D一个普通下采样模块DownBlock2D②中间一个中间模块UnetMidBlock2DCrossAttn③上采样一个普通上采样模块UpSample2D三个cross attention上采样模块CrossAttnUpBlock2D接下来我们逐个分析每个模块cross attention下采样模块CrossAttnDownBlock2D来详细看cross attention下采样模块的结构很明显这里面包括三个子块① ResnetBlock2D② Transformer2DModel③ DownSample2D一步步来看每个子模块包含啥ResnetBlock2DResnetBlock2D的输入包括两部分① 上一层的latent② 时间步的embeddingPS输入输出通道数不一致的时候残差连接会用一个1x1的卷积时间步编码模块的结构如下图所示接下来看Transformer2DModel子模块这个模块的输入也是包括两部分① 上一层的latent② 文本的embedding其shape[2, 77, 768]来看看BasicTransformerBlock块更进一步拆解SelfAttention的结构为CrossAttention的结构为很多面试里会问到Unet中的cross attention其实是在这里Q的根源来自图像特征经过了一些列的中间块处理KV来自文本Feedforward就很显而易见了跟transformer中的类似接下来看DownSample2D子模块上面都是cross attention下采样模块CrossAttnDownBlock2D下面分析DownBlock2D上面分析完了所有下采样看一眼中间模块UnetMidBlock2DCrossAttn最后是上采样的UpBlock2D模块UpSample2DCrossAttnUpBlock2D注意, 最后一个CrossAttnUpBlock2D没有UpSample2D模块2.CLIP的详细结构CLIP这里用到的是文本编码器结构如下:CLIPTextEmbeddings灰色的框框text_inoputs和embedding不是操作是表示输入输出:CLIPEncoderLayerCLIPEncoderLayer就是普通的Transformer 的Encoder层了总结Unet的重点在于哪个cross attention下采样模块里面包含resblock和transformer相关的block其中resblock接受时间步嵌入作为输入transformer模块接受文本嵌入作为输入这块就是用到了cross attention。Q的根源是来此图像但是是经过了很多层处理后的latent featureKV来自文本嵌入。参考Stable Diffusion1.5网络结构-超详细原创