Diffusers documentation
UNet2DConditionModel
UNet2DConditionModel
Модель UNet была первоначально представлена Ronneberger et al. для сегментации биомедицинских изображений, однако она также широко используется в 🤗 Diffusers, поскольку на выходе она генерирует изображения того же размера, что и входные. Это один из ключевых компонентов диффузионной системы, так как именно он обеспечивает непосредственный процесс диффузии. В 🤗 Diffusers существует несколько вариантов модели UNet, которые различаются количеством измерений и тем, является ли модель условной. Здесь представлена условная 2D-модель UNet.
Аннотация из статьи:
Существует широкое согласие в том, что успешное обучение глубоких сетей требует тысяч размеченных обучающих примеров. В данной статье мы представляем сеть и стратегию обучения, которые опираются на активное использование аугментации данных для более эффективного использования доступных размеченных примеров. Архитектура состоит из сжимающего пути для захвата контекста и симметричного расширяющего пути, обеспечивающего точную локализацию. Мы показываем, что такая сеть может быть обучена end-to-end по очень малому количеству изображений и превосходит предыдущий лучший метод (сверточная сеть со скользящим окном) на конкурсе ISBI по сегментации нейронных структур в электронных микроскопических стопках. Используя ту же сеть, обученную на изображениях, полученные с помощью световой микроскопии (фазовый контраст и DIC), мы с большим отрывом выиграли конкурс ISBI по отслеживанию клеток 2015 года в этих категориях. Кроме того, сеть работает быстро. Сегментация изображения 512x512 занимает менее секунды на современном GPU. Полная реализация (на основе Caffe) и обученные сети доступны по адресу http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net.
UNet2DConditionModel
класс diffusers.UNet2DConditionModel
< source >( sample_size: int | tuple[int, int] | None = Nonein_channels: int = 4out_channels: int = 4center_input_sample: bool = Falseflip_sin_to_cos: bool = Truefreq_shift: int = 0down_block_types: tuple[str, ...] = ('CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'DownBlock2D')mid_block_type: str | None = 'UNetMidBlock2DCrossAttn'up_block_types: tuple[str, ...] = ('UpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D')only_cross_attention: bool | tuple[bool] = Falseblock_out_channels: tuple[int, ...] = (320, 640, 1280, 1280)layers_per_block: int | tuple[int] = 2downsample_padding: int = 1mid_block_scale_factor: float = 1dropout: float = 0.0act_fn: str = 'silu'norm_num_groups: int | None = 32norm_eps: float = 1e-05cross_attention_dim: int | tuple[int] = 1280transformer_layers_per_block: int | tuple[int] | tuple[tuple] = 1reverse_transformer_layers_per_block: tuple[tuple[int]] | None = Noneencoder_hid_dim: int | None = Noneencoder_hid_dim_type: str | None = Noneattention_head_dim: int | tuple[int] = 8num_attention_heads: int | tuple[int] | None = Nonedual_cross_attention: bool = Falseuse_linear_projection: bool = Falseclass_embed_type: str | None = Noneaddition_embed_type: str | None = Noneaddition_time_embed_dim: int | None = Nonenum_class_embeds: int | None = Noneupcast_attention: bool = Falseresnet_time_scale_shift: str = 'default'resnet_skip_time_act: bool = Falseresnet_out_scale_factor: float = 1.0time_embedding_type: str = 'positional'time_embedding_dim: int | None = Nonetime_embedding_act_fn: str | None = Nonetimestep_post_act: str | None = Nonetime_cond_proj_dim: int | None = Noneconv_in_kernel: int = 3conv_out_kernel: int = 3projection_class_embeddings_input_dim: int | None = Noneattention_type: str = 'default'class_embeddings_concat: bool = Falsemid_block_only_cross_attention: bool | None = Nonecross_attention_norm: str | None = Noneaddition_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) — Определяет, следует ли заменить sin на cos во временном эмбеддинге. - 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(
boolortuple[bool], optional, по умолчаниюFalse) — Включать ли self-attention в базовых блоках трансформера, см.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) — значение эпсилон, используемое для нормализации. - 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): Количество блоков трансформера типаBasicTransformerBlockв блоках апсемплинга U-Net. Актуально только если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_hidden_statesи, возможно, другие эмбеддинги проецируются в эмбеддинги текста размерностиcross_attentionв соответствии сencoder_hid_dim_type. - 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) — Входное измерение обучаемой матрицы эмбеддингов, проецируемой вtime_embed_dim, при выполнении условного кодирования по классу, когдаclass_embed_typeравноNone. - 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_labels, когдаclass_embed_type="projection". Обязателен, еслиclass_embed_type="projection". - class_embeddings_concat (
bool, необязательный, по умолчаниюFalse) — Соединять ли временные эмбеддинги с эмбеддингами классов. - mid_block_only_cross_attention (
bool, необязательный, по умолчаниюNone) — Использовать ли cross attention с mid block при использовании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: floats2: floatb1: floatb2: float )
Параметры
- s1 (
float) — Коэффициент масштабирования для этапа 1, ослабляющий вклад признаков пропуска. Это делается для смягчения «эффекта чрезмерного сглаживания» в процессе улучшенного шумоподавления. - s2 (
float) — Коэффициент масштабирования для этапа 2, ослабляющий вклад признаков пропуска. Это делается для смягчения «эффекта чрезмерного сглаживания» в процессе улучшенного шумоподавления. - b1 (
float) — Коэффициент масштабирования для этапа 1, усиливающий вклад признаков базовой модели. - b2 (
float) — Коэффициент масштабирования для этапа 2, усиливающий вклад признаков базовой модели.
Включает механизм FreeU из https://huggingface.co/papers/2309.11497.
Суффиксы после коэффициентов масштабирования обозначают блоки стадий, в которых они применяются.
Список комбинаций значений, которые хорошо работают для различных пайплайнов, таких как Stable Diffusion v1, v2 и Stable Diffusion XL, см. в официальном репозитории.
forward
< source >( sample: Tensortimestep: typing.Union[torch.Tensor, float, int]encoder_hidden_states: Tensorclass_labels: typing.Optional[torch.Tensor] = Nonetimestep_cond: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Nonecross_attention_kwargs: dict[str, typing.Any] | None = Noneadded_cond_kwargs: dict[str, torch.Tensor] | None = Nonedown_block_additional_residuals: tuple[torch.Tensor] | None = Nonemid_block_additional_residual: typing.Optional[torch.Tensor] = Nonedown_intrablock_additional_residuals: tuple[torch.Tensor] | None = Noneencoder_attention_mask: typing.Optional[torch.Tensor] = Nonereturn_dict: bool = True ) → UNet2DConditionOutput or tuple
Параметры
- sample (
torch.Tensor) — Шумовой входной тензор со следующей формой(batch, channel, height, width). - timestep (
torch.Tensorилиfloatилиint) — Количество шагов для денойзинга входных данных. - encoder_hidden_states (
torch.Tensor) — Скрытые состояния энкодера с формой(batch, sequence_length, feature_dim). - class_labels (
torch.Tensor, необязательный, по умолчаниюNone) — Необязательные метки классов для условного формирования. Их эмбеддинги будут сложены с эмбеддингами временного шага. - timestep_cond — (
torch.Tensor, необязательный, по умолчаниюNone): Условные эмбеддинги для временного шага. Если переданы, эмбеддинги будут сложены с сэмплами, прошедшими через слойself.time_embedding, чтобы получить эмбеддинги временного шага. - attention_mask (
torch.Tensor, необязательный, по умолчаниюNone) — Маска внимания формы(batch, key_tokens)применяется кencoder_hidden_states. Если значение равно1, маска сохраняется, иначе, если равно0, — отбрасывается. Маска преобразуется в смещение (bias), которое добавляет большие отрицательные значения к оценкам внимания, соответствующим токенам, помеченным как «отбросить». - cross_attention_kwargs (
dict, необязательный) — Словарь kwargs, который при указании передается вAttentionProcessor, определенный вself.processorв модуле diffusers.models.attention_processor. - added_cond_kwargs — (
dict, необязательный): Словарь kwargs, содержащий дополнительные эмбеддинги, которые при указании добавляются к эмбеддингам, передаваемым в блоки UNet. - down_block_additional_residuals — (
tupleизtorch.Tensor, необязательный): Кортеж тензоров, которые при указании добавляются к остаточным связям блоков down в U-Net. - mid_block_additional_residual — (
torch.Tensor, необязательный): Тензор, который при указании добавляется к остаточному соединению среднего блока unet. - down_intrablock_additional_residuals (
tupleизtorch.Tensor, необязательный) — дополнительные остаточные связи, добавляемые внутри блоков понижения разрешения UNet, например, из боковых моделей T2I-Adapter - encoder_attention_mask (
torch.Tensor) — Маска кросс-внимания формы(batch, sequence_length), применяемая кencoder_hidden_states. ЕслиTrue, маска сохраняется, иначе, еслиFalse, она отбрасывается. Маска преобразуется в смещение (bias), которое добавляет большие отрицательные значения к оценкам внимания, соответствующим токенам «отбрасывания». - return_dict (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли возвращать UNet2DConditionOutput вместо обычного кортежа.
Возвращает
UNet2DConditionOutput или tuple
Если return_dict равно True, возвращается UNet2DConditionOutput,
иначе возвращается tuple, где первый элемент — это тензор выборки.
Метод forward модели UNet2DConditionModel.
Включает объединённые проекции QKV. Для модулей само-внимания все матрицы проекций (т. е. запрос, ключ, значение) объединяются. Для модулей кросс-внимания объединяются матрицы проекций ключа и значения.
> Этот API 🧪 экспериментальный.
set_attention_slice
< source >( slice_size: str | int | list[int] = 'auto' )
Параметры
- slice_size (
strилиintилиlist(int), необязательный, по умолчанию"auto") — Если указано"auto", вход для головок внимания делится пополам, и внимание вычисляется в два этапа. Если указано"max", экономится максимальное количество памяти за счёт обработки одного среза за раз. Если предоставлено число, используется столько срезов, сколько получается изattention_head_dim // slice_size. В этом случаеattention_head_dimдолжно быть кратнымslice_size.
Включить вычисление внимания с нарезкой.
Когда эта опция включена, модуль внимания разбивает входной тензор на фрагменты, чтобы вычислять внимание в несколько шагов. Это полезно для экономии памяти ценой небольшого снижения скорости.
Отключает пользовательские обработчики внимания и устанавливает реализацию внимания по умолчанию.
Отключает объединенную проекцию QKV, если она включена.
> Этот API 🧪 экспериментальный.
UNet2DConditionOutput
класс diffusers.models.unets.unet_2d_condition.UNet2DConditionOutput
< source >( sample: Tensor = None )
Вывод UNet2DConditionModel.