Skip to content

U-Net 架构详解

U-Net 是深度学习中最重要的编码器-解码器对称架构之一,最初为生物医学图像分割而设计,后来成为扩散模型中噪声预测网络的事实标准。本页完整拆解 U-Net 的收缩路径、扩张路径、跳跃连接三件套,以及它在 Stable Diffusion 中扮演的角色、向 DiT 和 Mamba 演进的趋势,并在末尾覆盖 2024-2025 年的最新架构变体。前置阅读:扩散模型、VAE 变分自编码器、图像分割。

想象你在修复一幅受损的油画——

  • 编码器(收缩路径)= 你先退后三步,眯起眼睛看整体构图。画面细节虽然模糊了,但你看到了”远处是一片山""近处有一棵树”这样的全局语义。每退一步(下采样一次),分辨率降低但理解更抽象。
  • 解码器(扩张路径)= 看清构图后你走近画布,逐层精修细节——先恢复大致轮廓,再修补纹理笔触,最终还原到与原画相同的分辨率。
  • 跳跃连接(skip connection)= 你手里始终拿着一张原画的高清照片。每修一层就拿出来对照,确保细节不走样——“这棵树的枝干原来是向左弯的”。

为什么需要跳跃连接? 因为编码器一路下采样时丢失了大量空间细节(像素级位置信息),仅靠解码器自己”回忆”不够精确。跳跃连接把编码器浅层的高分辨率特征图直接抄送给解码器对应层,让网络同时拥有”全局理解”和”精确定位”两种能力。

一句话比喻:U-Net 像油画修复——先模糊看清整体构图(编码器下采样),再逐层精修细节(解码器上采样),跳跃连接像拿着原画照片对比确保细节不偏。

一个常见疑问:如果下采样后直接上采样,为什么不能做成 V 形(纯串行,一层下去再一层上来),而要保留横向的跳跃连接?根本原因在于信息瓶颈(information bottleneck)。在 V 形结构中,整张图像的全部信息必须经过最底层那个最小分辨率的特征图——这是一个极端的压缩-解压过程,大量高频空间细节(纹理、边缘、位置)在压缩中被不可逆地丢弃。U 形结构的跳跃连接提供了一条”绕过瓶颈”的信息高速公路,让浅层的高频细节直接送达解码器,不必经过瓶颈层。这类似于 ResNet 中残差连接(residual connection,把输入直接加到输出上以缓解梯度消失)的思想——都是为了解决深层网络中信息传递困难的问题。

U-Net(Ronneberger、Fischer、Brox,2015)的核心是一个严格对称的 U 形网络。左半边是收缩路径(编码器),右半边是扩张路径(解码器),中间通过跳跃连接横向贯通。整体形状酷似字母 U,这也是它名字的由来。

收缩路径由多个”下采样块”堆叠而成,每个块的结构是:两次 3×3 卷积(padding=1,保持分辨率不变)+ ReLU 激活函数(一种将负值置零的简单非线性函数,使网络能学习复杂的非线性映射),然后接一个 2×2 最大池化(max pooling,在每个 2×2 窗口中只保留最大值,使空间分辨率减半)做空间下采样,同时通道数翻倍。以最经典的 U-Net 配置为例:输入分辨率 572×572、通道数从 64 一路增加到 1024,空间分辨率则一路减半到 28×28。

通道数翻倍的直觉:通道(channel)可以理解为特征图的”厚度”——每个通道代表一种特征模式(如边缘、颜色、纹理)。越深层需要的语义类别越丰富,因此通道增多;同时空间分辨率降低(像素变少),计算量(FLOPs)在各层大致均匀——这就是经典的”面积守恒”资源分配策略。

扩张路径与收缩路径镜像对称:每个”上采样块”先用转置卷积(transposed convolution,也叫反卷积/deconvolution,是一种可学习的上采样操作——普通卷积缩小图像,转置卷积则放大图像,通过在输入像素之间插入可学习的权重来扩展空间尺寸)做空间上采样(长宽翻倍),然后接收来自对应编码器层的跳跃连接特征图——将上采样结果与跳跃特征图在通道维度拼接(concatenation),再做两次卷积 + ReLU,同时通道数减半。这样层层回升,最终输出与原始输入相同分辨率的特征图。

感受野(receptive field)的增长:感受野是指特征图上一个像素对应原始输入图像的区域大小。每下采样一次,深层特征图上一个像素”看到”的原图区域就翻倍。U-Net 的 4 层下采样使得瓶颈层的感受野覆盖几乎整张图像——这正是它能理解全局语义的原因。形象地说,浅层像”放大镜”(看细节),深层像”望远镜”(看全貌)。

编码器下采样块的内部结构详解

Section titled “编码器下采样块的内部结构详解”

一个标准的 U-Net 编码器块可以分解为以下步骤(以第一层为例):

  1. 第一卷积:Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1)。卷积核(kernel)是一个 3×3 的可学习权重矩阵,在输入图像上滑动做加权求和。一个 3×3 卷积核的感受野是 3×3,两层 3×3 卷积叠起来的感受野等价于一层 5×5 卷积,但参数量更少(18 vs 25)——这就是为什么现代网络偏好小卷积核。
  2. ReLU 激活:f(x) = max(0, x)。将负值截断为零,引入非线性。
  3. 第二卷积:Conv2d(64, 64, 3, padding=1)。进一步提取特征。
  4. ReLU 激活:再次非线性化。
  5. 保存跳跃连接:将第二卷积输出的特征图保存下来(skip = feat)。
  6. 最大池化:MaxPool2d(kernel_size=2, stride=2)。2×2 窗口、步长 2,输出空间分辨率减半。

跳跃连接:弥补下采样的空间损失

Section titled “跳跃连接:弥补下采样的空间损失”

跳跃连接是 U-Net 精确定位能力的核心。理解它的关键在于:最大池化是一个有损操作——2×2 池化只在每个窗口保留一个最大值,丢掉了其余 75% 的信息。越往下采样,空间位置信息越模糊。

跳跃连接的工作方式:编码器第 i 层输出一个高分辨率特征图 F_enc_i,经过下采样进入更深层。解码器在对应的上采样层 i,将其上采样恢复的特征图 F_dec_i 与 F_enc_i 在通道维度拼接(concatenation),得到一个通道数翻倍的组合特征图,再通过卷积融合。数学上:

F_combined = Concat(F_enc_i, F_dec_i) # 通道维度拼接
F_fused = Conv(F_combined) # 卷积融合两类信息

拼接后的卷积层学会了在”深层语义”和”浅层细节”之间做加权融合——这是一个可学习的特征选择过程,而非简单的相加。这样解码器既保留了深层提取的语义信息,又恢复了浅层丢失的空间细节。

这种设计的效果是革命性的:在分割任务中,网络不仅能判断”图像里有什么”(语义,靠深层特征),还能精确标出”在哪个像素位置”(定位,靠浅层特征)。传统 CNN 分类网络只需要前者,分割任务则两者缺一不可。

U-Net 原始论文使用的损失函数是像素级交叉熵(pixel-wise cross-entropy):

L=−∑x∑cw(x)⋅yc(x)⋅log⁡(pc(x))L = -\sum_{x} \sum_{c} w(x) \cdot y_c(x) \cdot \log(p_c(x))

其中 x 是像素位置,c 是类别,p_c(x) 是模型对像素 x 属于类别 c 的预测概率,y_c(x) 是真实标签(one-hot),w(x) 是位置权重。U-Net 的创新之一是引入了加权策略:对分割边界附近的像素赋予更高的权重 w(x),迫使网络学习精确的边界。对于类别极不平衡的情况(如医学图像中目标占比 < 1%),后来常用 Dice 损失替代或配合交叉熵。Dice 损失直接优化预测掩码与真实掩码的重叠度(Dice 系数):

LDice=1−2∣A∩B∣∣A∣+∣B∣L_{\text{Dice}} = 1 - \frac{2|A \cap B|}{|A| + |B|}

其中 A 是预测的前景区域,B 是真实前景区域。这个损失天然不受类别不平衡影响,在医学分割中几乎是标配。

在扩散模型中的角色:噪声预测网络 epsilon_theta

Section titled “在扩散模型中的角色:噪声预测网络 epsilon_theta”

U-Net 从分割架构变成生成架构的核心骨干,是扩散模型发展史上最重要的一次”跨界复用”。在 DDPM 中,U-Net 扮演噪声预测网络 epsilon_theta 的角色——它的任务是:给定一张加噪图像 x_t、当前时间步 t、以及可选的条件 c,预测这幅图像中混入的噪声 epsilon。

扩散过程简介:扩散模型的训练分两步——(1) 前向扩散:往干净图像 x_0 中逐步加入高斯噪声,经过 T 步后变成纯噪声 x_T(像墨水滴入清水,逐渐模糊直到完全随机)。(2) 反向去噪:训练 U-Net 学会从噪声图像中逐步”猜出”加了什么噪声,然后减去它——反复去噪 T 步后恢复出干净图像。这个”猜噪声”就是 U-Net 的工作。

输入输出关系如下:

输入 = 噪声潜变量 z_t + 时间步嵌入 t_emb + 条件嵌入 c_emb
输出 = 预测的噪声 epsilon_theta(z_t, t, c)

损失函数是预测噪声与真实噪声的均方误差(MSE):

L=∥ϵ−ϵθ(xt,t)∥2L = \|\epsilon - \epsilon_\theta(x_t, t)\|^2

这里的 epsilon 是前向扩散时实际添加的噪声(训练时随机采样得到),epsilon_theta 是 U-Net 的预测。注意一个精妙之处:MSE 损失不需要人工标注——噪声是训练时自己加的,因此已知”正确答案”。这使得扩散模型可以像自监督学习一样在海量无标注图像上训练。

与原始分割 U-Net 相比,扩散模型中的 U-Net 有三个关键改造:

  1. 时间步嵌入注入:扩散去噪是一个随时间步变化的动态过程,网络必须”知道当前噪声有多大”。做法是把时间步 t 通过一个正弦位置编码(sinusoidal positional encoding)——这是一种把整数 t 映射到高维向量的方法,使用不同频率的正弦/余弦函数,类似于 Transformer 中编码序列位置的技巧——再通过 MLP(多层感知机,即两到三层全连接网络)投影后注入每个残差块(residual block,内部有跨层连接的卷积块)。注入方式通常用加法:h = h + t_emb_projected。这让同一个 U-Net 能处理从”几乎没噪声”到”全是噪声”的全部时间步。
  2. 条件注入(cross-attention):文生图模型需要理解文本提示。Stable Diffusion 的 U-Net 在编码器和解码器之间穿插了 cross-attention 层(交叉注意力层)——文本经过 CLIP(Contrastive Language-Image Pre-training,OpenAI 开发的模型,将文本和图像映射到同一个向量空间,使”猫”的文字和猫的图像在向量空间中距离很近)编码成 token 序列后作为 cross-attention 的 key 和 value,图像特征作为 query,从而让图像的每个空间位置都能”看到”文本提示中的相关词汇。

注意力机制(attention)通俗解释:想象你在阅读一段长文——你的注意力不是均匀分配给每个字的,而是聚焦在与当前任务相关的关键词上。注意力机制就是这个过程的数学化:对于每个”查询”(query),在所有”键值对”(key-value)中计算相似度,按相似度加权求和得到输出。Cross-attention 中 query 来自一个模态(图像),key/value 来自另一个模态(文本),实现了跨模态信息融合。

  1. 在潜空间而非像素空间操作:Latent Diffusion 不直接在像素分辨率上跑 U-Net,而是先用 VAE 编码器 把图像压缩到潜空间(latent space,一种低维连续表示空间——可以理解为图像的”压缩编码”,512×512 的图像被压缩成 64×64×4 的张量,信息高度浓缩但在解码后能恢复大部分视觉内容),在潜空间做扩散,再用 VAE 解码器还原。这让 U-Net 的计算量降低约 48 倍——因为计算量正比于像素数(512² → 64² 约减少 64 倍),加上通道压缩后总减少约 48 倍。

Stable Diffusion 1.x/2.x 的 UNet 由四部分组成:输入块(input blocks)、中间块(mid block)、输出块(output blocks),以及贯穿其中的时间步嵌入和文本 cross-attention。具体而言:

  • 输入块:包含 12 个层(从 320 通道入口,经过 4 次下采样到 320 通道最低分辨率),每个分辨率层级包含 2-3 个 ResNet 块 + self-attention/cross-attention 层。
  • 中间块:两个 ResNet 块夹一个 cross-attention 层(结构为 ResNet → Self-Attention → Cross-Attention → ResNet),在最低分辨率处理最抽象的特征。
  • 输出块:与输入块对称,每个层级上采样后接收跳跃连接的编码器特征,再经过 ResNet 块 + attention 层融合。
  • 时间步嵌入:通过正弦编码 + MLP 后注入每个 ResNet 块的 GroupNorm 归一化输出(一种先归一化再加时间偏移的设计)。

SD 的 UNet 参数量约 860M(SD 1.5),是整个模型中最大的组件——相比之下 VAE 只有约 84M 参数,CLIP 文本编码器约 123M 参数。SDXL 的 UNet 更大,约 2.6B 参数,支持 1024×1024 原生分辨率。

归一化(Normalization):在神经网络中,归一化是指把中间特征值的分布调整为均值 0、方差 1 的操作,再通过可学习的缩放和平移参数恢复。它能稳定训练、加速收敛。U-Net 中最常用的是 GroupNorm(把通道分组后分别归一化),而非 BatchNorm(对整个 batch 归一化)——因为扩散模型训练时 batch size 经常很小(1-4),BatchNorm 的统计量不稳定。

U-Net 作为扩散模型骨干统治了 2020-2023 年的图像生成领域。但 Peebles 和 Xie 在 2022 年的论文《Scalable Diffusion Models with Transformers》中发现了一个关键事实:Transformer 骨干在扩散模型上展现出比 U-Net 更好的可扩展性(scalability)。

**可扩展性(scalability)**指的是:当模型参数量、训练数据量和计算量同步增大时,性能是否能持续提升、且提升幅度可预测。大语言模型(LLM)的成功正是得益于 Transformer 的出色可扩展性——参数越多,性能越强,且遵循幂律(power law)。

具体来说,当模型参数量和计算量持续增大时,Transformer 架构的生成质量(FID 指标,即 Fréchet Inception Distance,衡量生成图像与真实图像分布距离的指标,越低越好)随之平滑下降,呈现出类似大语言模型 scaling law 的幂律趋势。而 U-Net 的卷积归纳偏置(inductive bias,即架构设计内置的假设——卷积内置的”局部性”和”平移不变性”假设)在模型规模放大时反而成了瓶颈:Transformer 通过全局自注意力(self-attention)能建模任意距离的依赖关系,而卷积受限于局部感受野。这一发现催生了 DiT(Diffusion Transformer),详见 DiT 扩散Transformer。

从此扩散模型骨干的演进路线清晰可见:UNet(2020-2023)→ DiT(2022-2024)→ MMDiT 多模态(2024 至今)。Stable Diffusion 3(2024 年 6 月发布)和 Flux(2024 年 7 月发布,Black Forest Labs)已经从 UNet 彻底切换到 DiT 系架构。但 U-Net 并非过时——在计算受限场景(消费级 GPU、移动端)下,卷积 U-Net 仍因推理速度快、显存占用低而保有竞争力。

Attention U-Net(Oktay et al., 2018)在标准 U-Net 的跳跃连接处增加了注意力门(Attention Gate)。标准 U-Net 的跳跃连接是机械的特征拼接——编码器浅层特征图中的所有空间位置都被原封不动送给解码器,包括背景区域的无关特征。Attention Gate 的做法是:用解码器上采样后的粗粒度特征作为 query,编码器送来的细粒度特征作为 key/value,通过一个注意力模块为每个空间位置计算一个权重 α(0 到 1 之间),将编码器特征乘以 α——抑制背景无关区域的响应、放大目标区域的响应。

注意力门逐空间位置计算注意力系数 α\alpha,再用 α\alpha 加权编码器特征 FencF_{\text{enc}}:

α=sigmoid(Wq⋅Q+Wk⋅K+b)\alpha = \text{sigmoid}(W_q \cdot Q + W_k \cdot K + b) Frefined=α⊙FencF_{\text{refined}} = \alpha \odot F_{\text{enc}}

这种设计在医学图像分割中效果显著——胰腺、肾脏等小器官在 CT 图像中占比极小(可能不到 1% 的像素),标准 U-Net 容易被大片背景区域”淹没”,Attention Gate 让网络聚焦于目标区域。Attention U-Net 的注意力门可以插入到任意一层跳跃连接中,是”即插即用”的轻量增强。

ControlNet(Zhang & Agrawala, 2023)的核心思想是保留一个冻结的 UNet 副本来接收条件控制信号。详见 ControlNet 与可控生成。

具体实现:将预训练好的 Stable Diffusion UNet 复制一份,原始 UNet 参数完全冻结不训练,副本 UNet(称为 trainable copy)的权重用**零卷积(zero convolution)**初始化后开始训练。零卷积是指权重和偏置都初始化为零的 1×1 卷积层——这意味着训练第一步的输出恰好为零,副本对主网络没有任何影响。控制条件(线稿、深度图、姿态骨架等)输入副本 UNet,副本在每个层级产出差分特征,通过零卷积加到原始 UNet 的对应层。由于零卷积初始权重为零,训练开始时副本不影响原始 UNet(输出等于无 ControlNet 的情况),随训练逐步学习条件控制偏移量。

为什么用零初始化而不是随机初始化? 如果随机初始化,训练一开始副本就会向主网络注入随机扰动,破坏预训练好的生成能力(类似”灾难性遗忘”——模型在学习新任务时遗忘了旧知识)。零初始化保证了”从零偏移开始平滑学习”——这是一种保护预训练知识的精妙技巧。

这种设计的优势在于:不破坏原始 UNet 的生成能力,又能精确注入空间条件,训练成本远低于从头训练一个新 UNet。2024 年 ControlNet 进一步发展出 ControlNet-XS(参数量大幅缩小)和 IP-Adapter(基于图像提示而非结构条件)等变体。

2024-2025 新变体:U-Mamba 与 SSM 骨干

Section titled “2024-2025 新变体:U-Mamba 与 SSM 骨干”

2024 年以来,一种全新的架构范式——状态空间模型(State Space Model, SSM)——开始进入 U-Net 领域。SSM 是一类源自控制论的序列模型,通过一个连续时间的状态微分方程来建模序列依赖关系。Mamba(Gu & Dao, 2023)是 SSM 的代表方法,它通过选择性状态空间机制,实现了线性时间复杂度(O(N))的长序列建模——相比之下 Transformer 的自注意力是二次复杂度(O(N²)),在长序列上计算成本急剧增长。

U-Mamba(Ma et al., 2024,arXiv:2401.04722)将 SSM 与 U-Net 结合:设计了一个混合 CNN-SSM 块——先用卷积层提取局部特征(利用 CNN 的局部归纳偏置),再接一个 Mamba 层建模全局长程依赖。在腹部器官 3D 分割、内窥镜器械分割、显微镜细胞分割等四项任务上,U-Mamba 全面超越了基于 CNN 和 Transformer 的分割网络。它继承了 nnU-Net 的自配置机制(自动适配数据集),无需手动调参。

同期出现的 VM-UNet(Vision Mamba UNet)和 SegMamba 等也遵循类似思路。SSM 的优势在于:比卷积有更大的有效感受野(不局限于局部),比 Transformer 计算更高效(不随序列长度平方增长),尤其适合 3D 医学体数据的超大体素序列。这一方向是 2024-2025 年 U-Net 架构演进最活跃的前沿之一。

2024-2025 新趋势:移动端 U-Net 扩散

Section titled “2024-2025 新趋势:移动端 U-Net 扩散”

尽管大模型转向 DiT,但在移动端和边缘设备上,U-Net 仍是首选。MobileDiffusion(Google, 2023-2024)通过深度可分离卷积(depthwise separable convolution,把标准卷积拆成逐通道卷积 + 逐点卷积两步,大幅减少参数量)和知识蒸馏(knowledge distillation,用大模型教小模型),实现了在手机上 1 秒内生成 512×512 图像的潜空间 U-Net 扩散模型。SDXL Turbo(Stability AI, 2023 年底)和 LCM(Latent Consistency Model,2023)通过对抗蒸馏和一致性蒸馏技术,将 SD U-Net 的采样步数从 50 步压缩到 1-4 步,使 U-Net 在实时场景中保持竞争力。2024-2025 年,随着移动端 AI 芯片(如 Apple Neural Engine、Qualcomm Hexagon NPU)算力提升,端侧 U-Net 扩散推理的延迟进一步降到 0.5 秒以内。

下面的代码实现了一个最小化的 U-Net 下采样块和上采样块,展示跳跃连接的核心逻辑:

import torch
import torch.nn as nn
class DownBlock(nn.Module): # 编码器下采样块
def __init__(self, in_ch, out_ch):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(in_ch, out_ch, 3, padding=1), nn.ReLU(),
nn.Conv2d(out_ch, out_ch, 3, padding=1), nn.ReLU())
self.pool = nn.MaxPool2d(2) # 空间分辨率减半
def forward(self, x):
feat = self.conv(x) # 先保存特征, 供跳跃连接使用
return self.pool(feat), feat
class UpBlock(nn.Module): # 解码器上采样块
def __init__(self, in_ch, out_ch):
super().__init__()
self.up = nn.ConvTranspose2d(in_ch, out_ch, 2, stride=2) # 上采样 x2
self.conv = nn.Sequential(
nn.Conv2d(out_ch * 2, out_ch, 3, padding=1), nn.ReLU(), # 拼接后通道翻倍
nn.Conv2d(out_ch, out_ch, 3, padding=1), nn.ReLU())
def forward(self, x, skip): # skip = 编码器对应层的特征图
x = self.up(x)
x = torch.cat([skip, x], dim=1) # 跳跃连接: 通道维拼接
return self.conv(x)
# 测试: 输入 1x1x32x32, 经过一次下采样再上采样
inp = torch.randn(1, 1, 32, 32)
down = DownBlock(1, 64); up = UpBlock(64, 64)
pooled, skip = down(inp) # pooled: 1x64x16x16, skip: 1x64x32x32
out = up(pooled, skip) # 跳跃拼接后恢复到 1x64x32x32
print(out.shape) # → torch.Size([1, 64, 32, 32])

加入时间步嵌入的扩散 U-Net 残差块

Section titled “加入时间步嵌入的扩散 U-Net 残差块”

扩散模型中的 U-Net 每个卷积块都替换为残差块(ResNet block)——输入特征经过两层卷积后与输入做加法(残差连接),同时注入时间步嵌入。下面是一个简化实现:

class DiffusionResBlock(nn.Module):
"""扩散模型 U-Net 中带时间步注入的残差块"""
def __init__(self, in_ch, out_ch, time_emb_dim=256):
super().__init__()
self.norm1 = nn.GroupNorm(8, in_ch) # GroupNorm 归一化(不受 batch size 影响)
self.conv1 = nn.Conv2d(in_ch, out_ch, 3, padding=1)
self.norm2 = nn.GroupNorm(8, out_ch)
self.conv2 = nn.Conv2d(out_ch, out_ch, 3, padding=1)
# 时间步嵌入投影到通道维度
self.time_mlp = nn.Linear(time_emb_dim, out_ch)
# 残差连接: 如果通道数变化, 用 1x1 卷积对齐
self.residual_conv = nn.Conv2d(in_ch, out_ch, 1) if in_ch != out_ch else nn.Identity()
def forward(self, x, t_emb):
h = self.conv1(F.silu(self.norm1(x))) # SiLU 激活(比 ReLU 更平滑)
# 注入时间步: 把 t_emb 投影成 (B, out_ch), 扩展维度后加到特征图上
h += self.time_mlp(t_emb)[:, :, None, None]
h = self.conv2(F.silu(self.norm2(h)))
return h + self.residual_conv(x) # 残差连接

用 diffusers 检查 Stable Diffusion UNet 结构

Section titled “用 diffusers 检查 Stable Diffusion UNet 结构”
from diffusers import StableDiffusionPipeline
import torch
# 加载 SD 1.5, 只看 UNet 结构
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
unet = pipe.unet
print(f"UNet 参数量: {sum(p.numel() for p in unet.parameters()) / 1e6:.1f}M")
# → UNet 参数量: 约 859.5M
# 模拟一次前向: 输入潜变量 + 时间步 + 文本嵌入
latents = torch.randn(2, 4, 64, 64, dtype=torch.float16) # 潜空间噪声
timestep = torch.tensor([999], dtype=torch.float16) # 扩散时间步
encoder_hidden = torch.randn(2, 77, 768, dtype=torch.float16) # CLIP 文本嵌入
noise_pred = unet(latents, timestep, encoder_hidden_states=encoder_hidden).sample
print(noise_pred.shape) # → torch.Size([2, 4, 64, 64]) 与输入同形
# 逐层检查 UNet 的下采样过程
print(f"输入块数量: {len(unet.down_blocks)}") # → 4 (4 个分辨率层级)
for i, block in enumerate(unet.down_blocks):
print(f" 下采样块 {i}: {block.__class__.__name__}, "
f"输入通道 {block.in_channels}, 输出通道 {block.out_channels}")

原始 U-Net 论文的关键训练策略至今仍被沿用:

  1. 数据增强(data augmentation):医学标注数据极度稀缺(可能只有几十张),U-Net 论文通过弹性形变(elastic deformation,对图像做平滑的随机扭曲模拟组织形变)、平移、旋转、缩放等增强来扩充有效数据量。关键洞察是:医学图像的形变在生物学上是合理的(器官会自然变形),因此增强后的样本仍然”真实”。
  2. 加权损失:在分割边界附近赋予更高权重,迫使网络学习精确边界。
  3. 大尺寸 patch 训练:受限于当时 GPU 显存(2015 年的 Titan Black 只有 6GB),U-Net 论文用 tile-based 策略,将大图切成小块训练,同时用”镜像 padding”处理边界——这一策略让 U-Net 能处理任意尺寸的图像。
  4. 优化器:SGD + momentum(lr ≈ 0.01),训练约 1-2 万步。

扩散 U-Net 的训练与分割截然不同——它是自监督的,不需要分割掩码:

  1. 前向加噪采样:从训练集中随机取一张图像 x_0,随机采样一个时间步 t ∈ [1, T],根据扩散调度(diffusion schedule,即 β_t 的设定,控制每一步加多少噪声)加入高斯噪声,得到 x_t。
  2. U-Net 预测:将 x_t(或潜空间 z_t)和时间步 t 输入 U-Net,预测噪声 ε_θ(x_t, t)。
  3. MSE 损失:计算预测噪声与实际添加噪声 ε 的均方误差,反向传播。
  4. 优化器:AdamW 或 Adam(lr ≈ 1e-4),cosine learning rate schedule。
  5. 训练规模:SD 1.5 在 LAION-5B 数据集子集上用约 150,000 GPU 小时(A100)训练。SDXL 更大规模。训练的关键瓶颈不是算法而是工程——数据过滤(去除低质量图像)、学习率调度、EMA(Exponential Moving Average,用参数的滑动平均版本做推理以提升稳定性)都是标准实践。
分割任务扩散模型
标注需求像素级掩码(昂贵)无需标注(自监督)
典型数据量数十到数千张数百万到数十亿张
关键瓶颈标注成本算力和数据质量
过拟合风险高(数据少)中(数据多但需防记忆)
  • 跳跃连接是 U-Net 的灵魂:去掉跳跃连接,分割性能会急剧下降——解码器丢失了像素级定位能力,边界变得模糊。在扩散模型中同样如此,跳跃连接确保了高频细节的传递。实验表明移除跳跃连接后,分割 Dice 系数可下降 10-20%。
  • 通道翻倍、分辨率减半的经典节奏:编码器每下一层通道数翻倍(64→128→256→512→1024),空间分辨率减半,这是一种”面积不变”的资源分配——计算量在各层大致均匀(通道翻倍 × 分辨率减半 ≈ 乘积不变)。
  • 时间步注入方式很重要:扩散 U-Net 中,时间步 embedding 通常通过 AdaGN(Adaptive Group Normalization,把时间步嵌入作为 GroupNorm 的缩放和平移参数)注入到每个 ResNet 块中,这样每一层都能感知当前噪声水平。用正弦位置编码 + MLP 生成 embedding 是主流做法。
  • cross-attention 的位置影响文本控制力:在 U-Net 的每一层都加 cross-attention(如 SD 1.5)文本控制最精细但计算量大;只在深层加(如 SD 2.x 的部分变体)控制力略弱但更省显存。
  • Attention U-Net 的注意力门是轻量增强:不加 cross-attention 那么重,只在跳跃连接上做空间注意力,适合资源受限且目标占比小的分割任务。
  • ControlNet 训练时冻结原始 UNet 是关键:如果解冻原始 UNet 一起训练,模型容易”遗忘”原始生成能力(灾难性遗忘),零卷积 + 冻结策略确保了增量学习。
  • U-Net vs DiT 的选择:追求推理速度和显存效率(消费级 GPU、实时应用、移动端)选 U-Net;追求极限质量且算力充足(数据中心、大模型)选 DiT。2025 年的实践表明,这一分工在短期内不会消失——卷积在效率上的优势是结构性的。
  • V-Net、3D U-Net 是 3D 扩展:把 2D 卷积换成 3D 卷积(kernel 变成 3×3×3)即可处理体数据(医学 CT/MRI 体素),在医学影像和视频扩散模型中使用。
  • Mamba/SSM 是新的第三路线:2024 年以来 U-Mamba 等架构在医学分割上展现出超越 CNN 和 Transformer 的潜力,值得关注——它兼有 CNN 的局部建模能力和 Transformer 的全局视野,且计算效率优于 Transformer。
  • Stable Diffusion 1.x / 2.x:Stable Diffusion 的核心去噪网络就是潜空间 U-Net,参数量约 860M(SD 1.5)/ 2.6B(SDXL),是文生图领域使用最广泛的开源 U-Net 实现。详见 SD 架构详解。
  • 生物医学图像分割:U-Net 的原始用途——细胞分割、器官分割、病灶检测。 nnU-Net v2(Isensee et al., 2023,no new U-Net)框架基于 U-Net 自动适配各种医学数据集,是医学影像领域的基准方法。2023 年发布的 MedNeXt(Roy et al.)借鉴 ConvNeXt 的设计,用大卷积核(7×7 以上)和深度可分离卷积升级了 U-Net 编码器,在多项医学分割基准上刷新纪录。详见 图像分割。
  • AnimateDiff:在 SD U-Net 的基础上插入时序注意力层(temporal attention)——一种沿时间维度做自注意力的机制,让静态图像 U-Net 学会生成连贯的动画帧。2024 年 AnimateDiff 进一步演化出支持更长视频、更高分辨率的变体。详见 AnimateDiff 动画生成。
  • ControlNet:冻结 SD U-Net 并训练可控副本,实现线稿、深度图、姿态等条件对生成结果的精确控制。2024 年衍生出 ControlNet-XS(轻量化)、IP-Adapter(图像提示)等。详见 ControlNet 与可控生成。
  • SDXL Turbo / LCM:通过对抗蒸馏(adversarial distillation,训练一个判别器来区分单步生成图和真实图)和一致性蒸馏(consistency distillation,约束模型在任意时间步的输出都能映射到同一条去噪轨迹),将 U-Net 的采样步数从 50 步压缩到 1-4 步,实现近实时生成。
  • MobileDiffusion(Google, 2023-2024):专为移动端优化的 U-Net 扩散模型,使用深度可分离卷积和架构搜索技术,在智能手机上实现亚秒级图像生成,已集成进 Android 等移动平台。
  • 卫星遥感图像分析:U-Net 用于道路提取、建筑物轮廓勾画、土地覆盖分类——遥感图像通常需要像素级分割且标注数据稀缺,U-Net 的数据效率在此时优势明显。
类库语言说明
diffusersPythonHugging Face 出品,内置 Stable Diffusion U-Net 预训练权重,支持推理与微调
PyTorchPython手写 U-Net 的首选框架,torch.nn.Conv2d / ConvTranspose2d 即可搭建完整网络
segmentation_models_pytorchPython专为分割任务设计的 U-Net 库,支持多种编码器骨干(ResNet/EfficientNet 等)
nnU-Net v2Python医学影像分割的自适应框架,基于 U-Net 自动调参,无需手动配置,2023 年发布 v2 版
MedNeXtPython基于 ConvNeXt 的大卷积核 U-Net 变体,专为 3D 医学分割优化
U-MambaPythonCNN-SSM 混合架构,2024 年发布,在多个医学分割任务上超越 CNN/Transformer 方法
MONAIPython医学影像深度学习框架,内置 2D/3D U-Net 及完整训练评估管线
TensorFlow / KerasPythonKeras 有官方 U-Net 教程实现,适合快速原型开发
ComfyUIPython / JS节点式工作流工具,底层使用 SD U-Net,可视化编排生成流程
术语英文解释
编码器EncoderU-Net 的收缩路径,通过卷积和下采样提取多尺度语义特征
解码器DecoderU-Net 的扩张路径,通过转置卷积上采样恢复空间分辨率
跳跃连接Skip Connection将编码器浅层特征图直接拼接到解码器对应层,弥补下采样丢失的空间细节
收缩路径Contracting PathU-Net 的左半边,逐步下采样捕获上下文和语义信息
扩张路径Expanding PathU-Net 的右半边,逐步上采样恢复分辨率实现精确定位
转置卷积Transposed Convolution用于上采样的可学习操作,将低分辨率特征图放大到高分辨率
感受野Receptive Field特征图上一个像素对应的原始输入图像区域大小,深层感受野更大
归一化Normalization将特征值分布调整为均值 0 方差 1 的操作,再通过可学习参数恢复,用于稳定训练
GroupNormGroup Normalization把通道分组后分别归一化,不受 batch size 影响,扩散模型中的标准选择
残差连接Residual Connection把输入直接加到输出上(h + x),缓解深层网络的梯度消失问题
瓶颈层BottleneckU-Net 最底层,分辨率最低、通道数最多,编码最抽象的全局信息
噪声预测网络epsilon_theta扩散模型中 U-Net 的角色,输入加噪图像和时间步,预测噪声
注意力门Attention GateAttention U-Net 中插入在跳跃连接处的注意力模块,抑制无关区域
零卷积Zero ConvolutionControlNet 中初始化为零的卷积层,保证训练初期不扰动原始 UNet
交叉注意力Cross-AttentionSD U-Net 中注入文本条件的机制,文本 token 作为 key/value
状态空间模型State Space Model (SSM)源自控制论的序列模型,通过状态微分方程建模依赖,Mamba 是其代表方法
深度可分离卷积Depthwise Separable Convolution将标准卷积拆为逐通道卷积 + 逐点卷积,大幅减少参数和计算量
知识蒸馏Knowledge Distillation用大模型(teacher)的输出训练小模型(student),压缩模型同时保持性能
潜空间Latent SpaceVAE 将图像压缩后的低维连续表示空间,Latent Diffusion 在此空间操作
正弦位置编码Sinusoidal Positional Encoding用不同频率的正弦/余弦函数将整数索引映射为高维向量,用于编码时间步
  • Ronneberger, Fischer & Brox, “U-Net: Convolutional Networks for Biomedical Image Segmentation” (MICCAI 2015):U-Net 原始论文,提出对称编码器-解码器结构和跳跃连接,引用量超 10 万,医学图像分割的奠基之作。
  • Ho et al., “Denoising Diffusion Probabilistic Models” (NeurIPS 2020):DDPM 论文,首次将 U-Net 作为扩散模型的噪声预测网络,开启了 U-Net 在生成模型中的大规模应用。详见 扩散模型。
  • Rombach et al., “High-Resolution Image Synthesis with Latent Diffusion Models” (CVPR 2022):Latent Diffusion / Stable Diffusion 论文,在潜空间使用 U-Net,并引入 cross-attention 注入文本条件,是 SD 架构的直接来源。
  • Oktay et al., “Attention U-Net: Learning Where to Look for the Pancreas” (MIDL 2018):Attention U-Net 论文,提出在跳跃连接处加注意力门,抑制无关区域响应。
  • Zhang & Agrawala, “Adding Conditional Control to Text-to-Image Diffusion Models” (ICCV 2023):ControlNet 论文,冻结 U-Net 并训练可控制副本,实现线稿/深度/姿态等条件的精确注入。详见 ControlNet 与可控生成。
  • Peebles & Xie, “Scalable Diffusion Models with Transformers” (ICCV 2023):DiT 论文,系统验证 Transformer 在扩散模型上的可扩展性优势,推动骨干从 U-Net 向 DiT 演进。详见 DiT 扩散Transformer。
  • Isensee et al., “nnU-Net: A Self-configuring Method for Deep Learning-based Biomedical Image Segmentation” (Nature Methods 2021):nnU-Net 框架论文,基于 U-Net 自动适配数据集,无需手动调参即达到 SOTA,是医学分割的实用标杆。
  • Ma et al., “U-Mamba: Enhancing Long-range Dependency for Biomedical Image Segmentation” (arXiv 2024):U-Mamba 论文,提出 CNN-SSM 混合块,在多个医学分割任务上超越 CNN 和 Transformer 方法,开启了 SSM 在分割领域的应用。
  • Roy et al., “MedNeXt: Transformer-driven Scaling of ConvNets for 3D Medical Image Segmentation” (MICCAI 2023):MedNeXt 论文,借鉴 ConvNeXt 的 up-scaled 卷积设计升级 3D U-Net 编码器,刷新多项医学分割基准。