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 (
int
或Tuple[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 中间部分的块类型,可以是UNetMidBlock2DCrossAttn
、UNetMidBlock2D
或UNetMidBlock2DSimpleCrossAttn
中的一个。如果为None
,则跳过中间块层。 - up_block_types (
Tuple[str]
, 可选,默认为("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D")
) — 用于上采样块的元组。 - only_cross_attention(
bool
或Tuple[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 (
int
或Tuple[int]
, 可选, 默认为 1280) — 交叉注意力特征的维度。 - transformer_layers_per_block (
int
,Tuple[int]
或Tuple[Tuple]
,可选,默认为1) —BasicTransformerBlock
类型转换块的数目。仅适用于CrossAttnDownBlock2D
、CrossAttnUpBlock2D
和UNetMidBlock2DCrossAttn
。 - reverse_transformer_layers_per_block — (
Tuple[Tuple]
,可选,默认为None):U-Net上采样块中BasicTransformerBlock
类型的转换块数目。仅在transformer_layers_per_block
为Tuple[Tuple]
类型且对于CrossAttnDownBlock2D
、CrossAttnUpBlock2D
、UNetMidBlock2DCrossAttn
时适用。 - encoder_hid_dim (
int
,可选,默认为None) — 如果定义了encoder_hid_dim_type
,则将encoder_hidden_states
从encoder_hid_dim
维度投影到cross_attention_dim
。 - encoder_hid_dim_type (
str
, 可选, 默认为None
) — 如果给定,则根据encoder_hid_dim_type
将encoder_hidden_states
和潜在的其他嵌入下投影到维度为cross_attention
的文本嵌入。 - attention_head_dim (
int
, 可选, 默认为 8) — 注意力头部的维度。 - num_attention_heads (
int
, 可选) — 注意力头部的数量。如果未定义,则默认为attention_head_dim
- resnet_time_scale_shift (
str
, 可选, 默认为"default"
) — 用于 ResNet 块的时间尺度移位配置(参见ResnetBlock2D
)。选择default
或scale_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
) — 用于时间步的长度的位置嵌入类型。从positional
或fourier
中选择。 - time_embedding_dim (
int
, 可选,默认为None
) — 投影时间嵌入维度的可选覆盖。 - time_embedding_act_fn (
str
,可选,默认为None
) — 在将时间嵌入传递到UNet其他部分之前,仅对时间嵌入使用一次的可选激活函数。从silu
、mish
、gelu
和swish
中选择。 - timestep_post_act (
str
,可选,默认为None
) — 时间嵌入中使用的第二个激活函数。从silu
、mish
和gelu
中选择。 - time_cond_proj_dim (
int
,可选,默认为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_attention
且mid_block_only_cross_attention
为None
,则使用only_cross_attention
的值作为mid_block_only_cross_attention
的值。否则默认为False
。
一个条件2D UNet模型,它接受一个噪声样本、条件状态和时间步,并返回一个形状为样本的输出。
此模型继承自 ModelMixin。有关所有模型(如下载或保存)的通用方法,请查看超类文档。
禁用FreeU机制。
enable_freeu
< source >( s1: float s2: float b1: float b2: float )
启用来自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.Tensor
或float
或int
) — 消除输入噪声所需的时间步数。 - 编码器隐藏状态 (
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
oftorch.Tensor
, 可选): 如果指定,则添加到下UNet块残差中的张量组。mid_block_additional_residual — (torch.Tensor
, 可选): 如果指定,则添加到中间UNet块残差中的张量。 - down_intrablock_additional_residuals (
tuple
oftorch.Tensor
, 可选) — 添加到UNet下块内部的额外残差,例如来自T2I-Adapter侧模型 - encoder_attention_mask (
torch.Tensor
) — 将一个形状为(batch, sequence_length)
的交叉注意力掩码应用于encoder_hidden_states
。如果为True
,则保留掩码,否则如果为False
则丢弃。掩码将转换为偏置,并为“丢弃”标记的注意力分数添加大负值。 - return_dict (
bool
, 可选,默认为True
) — 是否返回 UNet2DConditionOutput 而不是单纯的元组。
返回值
UNet2DConditionOutput 或 tuple
如果 return_dict
为 True,则返回 UNet2DConditionOutput,否则返回一个元组,其中第一个元素是样本张量。
《UNet2DConditionModel》的前向方法。
set_attention_slice
< source >( slice_size: Union = 'auto' )
启用分片注意力计算。
当此选项启用时,注意力模块将输入张量分割成多个切片以分步计算注意力。这对于以少量速度降低为代价节约内存是有用的。
set_attn_processor
参数
设置用于计算注意力的处理器。
set_default_attn_processor
( )
禁用自定义注意力处理器并设置默认的注意力实现。
UNet2DConditionOutput
类 diffusers.models.unets.unet_2d_condition.UNet2DConditionOutput
< 源代码 >( sample: Tensor = None )
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 (
int
或Tuple[int]
,可选,默认值为 8) — 注意力头部的维度。 - num_attention_heads (
int
或Tuple[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_dim (
bool
,可选,默认值为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 )
“返回一个新对象,用新值替换指定的字段。