Diffusers 文档

UNet2DConditionModel

Hugging Face's logo
加入 Hugging Face 社区

并获取增强文档体验

开始使用

UNet2DConditionModel

UNet 模型最初由 Ronneberger 等人提出,用于生物医学图像分割,但它也常用于 🤗 Diffusers,因为它输出的图像与输入大小相同。它是一个扩散系统的重要组成部分,因为它促进了实际的扩散过程。在 🤗 Diffusers 中有几种 UNet 模型的变体,这取决于其维度数量以及它是否为条件模型。这是一个二维 UNet 条件模型。

论文的摘要如下:

广泛共识认为,成功训练深度网络需要数千个标注的训练样本。本文提出了一种网络和训练策略,该方法高度重视数据增强,以更有效地利用可用的标注样本。该架构由一个收缩路径组成,用于捕捉上下文,以及一个对称的扩展路径,以实现精确定位。我们表明,此类网络可以从极少数图像中进行端到端训练,并在ISBI挑战赛中分割电子显微镜塔中的神经元结构方面优于先前最佳方法(滑动窗口卷积网络)。我们使用在透射光显微镜图像(相衬和DIC)上训练的相同网络,在ISBI细胞追踪挑战2015中在这些类别中取得了巨大的领先。此外,该网络速度很快。在最新的GPU上,512x512图像的分割不到一秒钟。完整的实现(基于Caffe)和训练好的网络可在http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net找到。

UNet2DConditionModel

diffusers.UNet2DConditionModel

< >

( sample_size: Optional = None in_channels: int = 4 out_channels: int = 4 center_input_sample: bool = False flip_sin_to_cos: bool = True freq_shift: int = 0 down_block_types: Tuple = ('CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'DownBlock2D') mid_block_type: Optional = 'UNetMidBlock2DCrossAttn' up_block_types: Tuple = ('UpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D') only_cross_attention: Union = False block_out_channels: Tuple = (320, 640, 1280, 1280) layers_per_block: Union = 2 downsample_padding: int = 1 mid_block_scale_factor: float = 1 dropout: float = 0.0 act_fn: str = 'silu' norm_num_groups: Optional = 32 norm_eps: float = 1e-05 cross_attention_dim: Union = 1280 transformer_layers_per_block: Union = 1 reverse_transformer_layers_per_block: Optional = None encoder_hid_dim: Optional = None encoder_hid_dim_type: Optional = None attention_head_dim: Union = 8 num_attention_heads: Union = None dual_cross_attention: bool = False use_linear_projection: bool = False class_embed_type: Optional = None addition_embed_type: Optional = None addition_time_embed_dim: Optional = None num_class_embeds: Optional = None upcast_attention: bool = False resnet_time_scale_shift: str = 'default' resnet_skip_time_act: bool = False resnet_out_scale_factor: float = 1.0 time_embedding_type: str = 'positional' time_embedding_dim: Optional = None time_embedding_act_fn: Optional = None timestep_post_act: Optional = None time_cond_proj_dim: Optional = None conv_in_kernel: int = 3 conv_out_kernel: int = 3 projection_class_embeddings_input_dim: Optional = None attention_type: str = 'default' class_embeddings_concat: bool = False mid_block_only_cross_attention: Optional = None cross_attention_norm: Optional = None addition_embed_type_num_heads: int = 64 )

参数

  • sample_size (intTuple[int, int]可选,默认为 None)— 输入/输出样本的高度和宽度。
  • in_channels (int可选,默认为 4)— 输入样本的通道数。
  • out_channels (int可选,默认为 4)— 输出的通道数。
  • center_input_sample (bool可选,默认为 False)— 是否将输入样本居中。
  • flip_sin_to_cos (bool, 可选, 默认为 True) — 是否在时间嵌入中将正弦翻转为余弦。
  • freq_shift (int, 可选, 默认为 0) — 应用到时间嵌入的频率偏移。
  • down_block_types (Tuple[str], 可选, 默认为 ("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")) — 要使用的下采样块的元组。
  • mid_block_type (str, 可选, 默认为 "UNetMidBlock2DCrossAttn") — UNet 中间部分的块类型,可以是 UNetMidBlock2DCrossAttnUNetMidBlock2DUNetMidBlock2DSimpleCrossAttn 中的一个。如果为 None,则跳过中间块层。
  • up_block_types (Tuple[str], 可选,默认为 ("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D")) — 用于上采样块的元组。
  • only_cross_attention(boolTuple[bool]可选,默认为 False) — 是否在基本转换器块中包含自注意力,请参阅 BasicTransformerBlock
  • block_out_channels (Tuple[int]可选,默认为 (320, 640, 1280, 1280)) — 每个块输出的通道元组。
  • layers_per_block (int可选,默认为 2) — 每个块中的层数。
  • downsample_padding (int, 可选, 默认为 1) — 用于下采样卷积的填充值。
  • mid_block_scale_factor (float, 可选, 默认为 1.0) — 中间模块的缩放因子。
  • dropout (float, 可选, 默认为 0.0) — 使用的dropout概率。
  • act_fn (str, 可选, 默认为 "silu") — 使用的激活函数。
  • norm_num_groups (int, 可选, 默认为 32) — 正则化使用的组数。如果为 None,则在后处理中跳过正则化和激活层。
  • norm_eps (float, 可选, 默认为 1e-5) — 正则化使用的 epsilon 值。
  • cross_attention_dim (intTuple[int], 可选, 默认为 1280) — 交叉注意力特征的维度。
  • transformer_layers_per_block (int, Tuple[int]Tuple[Tuple]可选,默认为1) — BasicTransformerBlock 类型转换块的数目。仅适用于 CrossAttnDownBlock2DCrossAttnUpBlock2DUNetMidBlock2DCrossAttn
  • reverse_transformer_layers_per_block — (Tuple[Tuple]可选,默认为None):U-Net上采样块中 BasicTransformerBlock 类型的转换块数目。仅在 transformer_layers_per_blockTuple[Tuple] 类型且对于 CrossAttnDownBlock2DCrossAttnUpBlock2DUNetMidBlock2DCrossAttn 时适用。
  • encoder_hid_dim (int可选,默认为None) — 如果定义了 encoder_hid_dim_type,则将 encoder_hidden_statesencoder_hid_dim 维度投影到 cross_attention_dim
  • encoder_hid_dim_type (str, 可选, 默认为 None) — 如果给定,则根据 encoder_hid_dim_typeencoder_hidden_states 和潜在的其他嵌入下投影到维度为 cross_attention 的文本嵌入。
  • attention_head_dim (int, 可选, 默认为 8) — 注意力头部的维度。
  • num_attention_heads (int, 可选) — 注意力头部的数量。如果未定义,则默认为 attention_head_dim
  • resnet_time_scale_shift (str, 可选, 默认为 "default") — 用于 ResNet 块的时间尺度移位配置(参见 ResnetBlock2D)。选择 defaultscale_shift
  • class_embed_type (str, 可选, 默认为 None) — 使用类型嵌入,该嵌入最终与时间嵌入求和。选择 None"timestep""identity""projection""simple_projection"
  • addition_embed_type (str, 可选, 默认为 None) — 配置一个可选的嵌入,它将加到时间嵌入上。选择 None 或 “text”。“text” 将使用 TextTimeEmbedding 层。 addition_time_embed_dim — (int, 可选, 默认为 None):时间嵌入的维度。
  • num_class_embeds (int, 可选,默认为 None) — 当与 class_embed_type 等于 None 时,执行类条件化后学习嵌入矩阵的输入维度将投影到 time_embed_dim
  • time_embedding_type (str, 可选,默认为 positional) — 用于时间步的长度的位置嵌入类型。从 positionalfourier 中选择。
  • time_embedding_dim (int, 可选,默认为 None) — 投影时间嵌入维度的可选覆盖。
  • time_embedding_act_fnstr,可选,默认为None) — 在将时间嵌入传递到UNet其他部分之前,仅对时间嵌入使用一次的可选激活函数。从silumishgeluswish中选择。
  • timestep_post_actstr,可选,默认为None) — 时间嵌入中使用的第二个激活函数。从silumishgelu中选择。
  • time_cond_proj_dimint,可选,默认为None) — 时间嵌入中cond_proj层的维度。
  • conv_in_kernel (int, 可选, 默认 3) — conv_in 层的内核大小。
  • conv_out_kernel (int, 可选, 默认 3) — conv_out 层的内核大小。
  • projection_class_embeddings_input_dim (int, 可选) — 当 class_embed_type="projection"class_labels 输入的维度。当 class Embed Type="projection" 时必需。
  • class_embeddings_concat (bool, 可选, 默认 False) — 是否将时间嵌入与类别嵌入连接起来。
  • mid_block_only_cross_attention (bool, 可选,默认为 None) — 当在使用 UNetMidBlock2DSimpleCrossAttn 时是否使用中间块的交叉注意力。如果只提供单个布尔值 only_cross_attentionmid_block_only_cross_attentionNone,则使用 only_cross_attention 的值作为 mid_block_only_cross_attention 的值。否则默认为 False

一个条件2D UNet模型,它接受一个噪声样本、条件状态和时间步,并返回一个形状为样本的输出。

此模型继承自 ModelMixin。有关所有模型(如下载或保存)的通用方法,请查看超类文档。

disable_freeu

< >

( )

禁用FreeU机制。

enable_freeu

< >

( s1: float s2: float b1: float b2: float )

参数

  • s1 (float) — 第1阶段缩放因子,用于降低跳过特征的影响。这是为了缓解增强去噪过程中的“过度平滑效应”。
  • s2 (float) — 第2阶段缩放因子,用于降低跳过特征的影响。这是为了缓解增强去噪过程中的“过度平滑效应”。
  • b1 (float) — 第1阶段缩放因子,用于增强骨架特征的影响。
  • b2 (浮点数) — 用于放大主干特性贡献的2级阶段扩展系数。

启用来自https://arxiv.org/abs/2309.11497的FreeU机制。

拉伸系数后的后缀表示这些系数所应用的阶段块。

请参阅官方仓库了解针对不同流水线(如Stable Diffusion v1、v2和Stable Diffusion XL)已知能良好工作的值组合。

前向

< >

( sample: Tensor timestep: 联合体 encoder_hidden_states: Tensor class_labels: 可选 = None timestep_cond: 可选 = None attention_mask: 可选 = None cross_attention_kwargs: 可选 = None added_cond_kwargs: 可选 = None down_block_additional_residuals: 可选 = None mid_block_additional_residual: 可选 = None down_intrablock_additional_residuals: 可选 = None encoder_attention_mask: 可选 = None return_dict: bool = True ) UNet2DConditionOutput or tuple

参数

  • sample (torch.Tensor) — 具有以下形状的噪声输入张量 (批处理, 通道, 高度, 宽度)
  • 时间步 (torch.Tensorfloatint) — 消除输入噪声所需的时间步数。
  • 编码器隐藏状态 (torch.Tensor) — 形状为 (batch, sequence_length, feature_dim) 的编码器隐藏状态。
  • 类别标签 (torch.Tensor, 可选, 默认为 None) — 可选的类别标签用于条件化。它们的嵌入将与大时间步嵌入相加。time_step_cond — (torch.Tensor, 可选, 默认为 None):时间步的的条件嵌入。如果提供,嵌入将与通过 self.time_embedding 层传递的样本进行相加,以获得时间步嵌入。
  • attention_mask (torch.Tensor, 可选, 默认为 None) — 将形状为 (batch, key_tokens) 的注意力掩码应用于 encoder_hidden_states。如果 1,则保留掩码,否则如果 0,则丢弃。掩码将被转换为偏置值,为“丢弃”标记的注意力分数添加大负值。
  • cross_attention_kwargs (dict, 可选) — 一个kwargs字典,如果指定,则传递给 AttentionProcessor,如 diffusers.models.attention_processor 中定义的。added_cond_kwargs — (dict, 可选): 包含额外嵌入的kwargs字典,如果指定,将添加到传递给UNet块的嵌入中。down_block_additional_residuals — (tuple of torch.Tensor, 可选): 如果指定,则添加到下UNet块残差中的张量组。mid_block_additional_residual — (torch.Tensor, 可选): 如果指定,则添加到中间UNet块残差中的张量。
  • down_intrablock_additional_residuals (tuple of torch.Tensor, 可选) — 添加到UNet下块内部的额外残差,例如来自T2I-Adapter侧模型
  • encoder_attention_mask (torch.Tensor) — 将一个形状为 (batch, sequence_length) 的交叉注意力掩码应用于 encoder_hidden_states。如果为 True,则保留掩码,否则如果为 False 则丢弃。掩码将转换为偏置,并为“丢弃”标记的注意力分数添加大负值。
  • return_dict (bool, 可选,默认为 True) — 是否返回 UNet2DConditionOutput 而不是单纯的元组。

返回值

UNet2DConditionOutputtuple

如果 return_dict 为 True,则返回 UNet2DConditionOutput,否则返回一个元组,其中第一个元素是样本张量。

《UNet2DConditionModel》的前向方法。

组合qkv投影

< >

( )

启用融合QKV投影。对于自注意力模块,所有投影矩阵(即询问、键、值)都融合。对于交叉注意力模块,键和值投影矩阵融合。

此API为🧪实验性。

set_attention_slice

< >

( slice_size: Union = 'auto' )

参数

  • slice_size (strintlist(int)可选,默认为 "auto")-当为 "auto" 时,输入到注意力头部的数据减半,因此注意力计算分为两步进行。如果为 "max",通过每次只运行一个切片来保存最大内存量。如果提供一个数字,将使用 attention_head_dim // slice_size 个切片。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用分片注意力计算。

当此选项启用时,注意力模块将输入张量分割成多个切片以分步计算注意力。这对于以少量速度降低为代价节约内存是有用的。

set_attn_processor

参数

设置用于计算注意力的处理器。

set_default_attn_processor

( )

禁用自定义注意力处理器并设置默认的注意力实现。

unfuse_qkv_projections

< >

( )

禁用已启用的融合QKV投影。

此API为🧪实验性。

UNet2DConditionOutput

diffusers.models.unets.unet_2d_condition.UNet2DConditionOutput

< >

( sample: Tensor = None )

参数

  • sample (torch.Tensor形状为(batch_size, num_channels, height, width)) — 在encoder_hidden_states输入下条件化的隐藏状态输出。模型的最后一层输出。

UNet2DConditionModel的输出。

FlaxUNet2DConditionModel

diffusers.FlaxUNet2DConditionModel

< >

( sample_size: int = 32 in_channels: int = 4 out_channels: int = 4 down_block_types: Tuple = ('CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'DownBlock2D') up_block_types: Tuple = ('UpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D') mid_block_type: Optional = 'UNetMidBlock2DCrossAttn' only_cross_attention: Union = False block_out_channels: Tuple = (320, 640, 1280, 1280) layers_per_block: int = 2 attention_head_dim: Union = 8 num_attention_heads: Union = None cross_attention_dim: int = 1280 dropout: float = 0.0 use_linear_projection: bool = False dtype: dtype = <class 'jax.numpy.float32'> flip_sin_to_cos: bool = True freq_shift: int = 0 use_memory_efficient_attention: bool = False split_head_dim: bool = False transformer_layers_per_block: Union = 1 addition_embed_type: Optional = None addition_time_embed_dim: Optional = None addition_embed_type_num_heads: int = 64 projection_class_embeddings_input_dim: Optional = None parent: Union = <flax.linen.module._Sentinel object at 0x7fb2b317ed40> name: Optional = None )

参数

  • sample_size (int可选) — 输入样本的大小。
  • in_channels (int, 可选,默认为4) — 输入样本中的通道数。
  • out_channels (int, 可选,默认为4) — 输出中的通道数。
  • down_block_types (Tuple[str], 可选,默认为 ("FlaxCrossAttnDownBlock2D", "FlaxCrossAttnDownBlock2D", "FlaxCrossAttnDownBlock2D", "FlaxDownBlock2D")) — 要使用的下采样块的元组。
  • up_block_types (Tuple[str], 可选,默认为 ("FlaxUpBlock2D", "FlaxCrossAttnUpBlock2D", "FlaxCrossAttnUpBlock2D", "FlaxCrossAttnUpBlock2D")) — 要使用的上采样块的元组。
  • mid_block_type (str, 可选,默认为 "UNetMidBlock2DCrossAttn") — UNet中间部分使用的块类型,可以是 UNetMidBlock2DCrossAttn 之一。如果为 None,则跳过中间块层。
  • block_out_channels (Tuple[int], 可选,默认为 (320, 640, 1280, 1280)) — 每个块的输出通道的元组。
  • layers_per_block (int, 可选,默认为 2) — 每个块中的层数量。
  • attention_head_dim (intTuple[int]可选,默认值为 8) — 注意力头部的维度。
  • num_attention_heads (intTuple[int]可选) — 注意力头部的数量。
  • cross_attention_dim (int可选,默认值为 768) — 跨注意力特征的维度。
  • dropout (float可选,默认值为 0) — 下、上和瓶颈块的dropout概率。
  • flip_sin_to_cos (bool, 可选,默认为 True) — 是否在时间嵌入中将正弦函数转换为余弦函数。
  • freq_shift (int, 可选,默认为 0) — 对时间嵌入应用频率偏移。
  • use_memory_efficient_attention (bool, 可选,默认为 False) — 启用内存高效注意力,见此处描述。
  • split_head_dimbool可选,默认值为 False) — 是否将头维度拆分为一个新的轴进行自我注意力计算。在大多数情况下,启用此标志应会加快稳定扩散 2.x 和稳定扩散 XL 的计算速度。

一个条件2D UNet模型,它接受一个噪声样本、条件状态和时间步,并返回一个形状为样本的输出。

此模型继承自 FlaxModelMixin。请检查其超类文档了解为所有模型实现的通用方法(如下载或保存)。

此模型也是 Flax Linen flax.linen.Module 的子类。可作为常规 Flax Linen 模块使用,并参阅 Flax 文档了解有关其一般用途和行为的所有相关事项。

支持以下继承自 JAX 的功能:

FlaxUNet2DConditionOutput

diffusers.models.unets.unet_2d_condition_flax.FlaxUNet2DConditionOutput

< >

( sample: Array )

参数

  • sample (jnp.ndarray of shape (batch_size, num_channels, height, width)) — 根据encoder_hidden_states输入条件输出的隐藏状态。模型最后一层的输出。

FlaxUNet2DConditionModel的输出。

替换

< >

( **updates )

“返回一个新对象,用新值替换指定的字段。

< > 更新在GitHub上