# UNet2DModel

Le modèle [UNet](https://huggingface.co/papers/1505.04597) a été initialement introduit par Ronneberger et al. pour la segmentation d'images biomédicales, mais il est également couramment utilisé dans 🤗 Diffusers car il produit des images de la même taille que l'entrée. C'est l'un des composants les plus importants d'un système de diffusion, car il facilite le processus de diffusion lui-même. Il existe plusieurs variantes du modèle UNet dans 🤗 Diffusers, en fonction de son nombre de dimensions et de savoir s'il s'agit ou non d'un modèle conditionnel. Il s'agit ici d'un modèle UNet 2D.

L'abstract de l'article est :

*Il est largement admis que l’entraînement réussi de réseaux profonds nécessite des milliers d’échantillons d’entraînement annotés. Dans cet article, nous présentons un réseau et une stratégie d’entraînement qui reposent sur l’utilisation intensive de l’augmentation de données afin d’exploiter plus efficacement les échantillons annotés disponibles. L’architecture se compose d’un chemin contractant pour capturer le contexte et d’un chemin d’expansion symétrique permettant une localisation précise. Nous montrons qu’un tel réseau peut être entraîné de bout en bout à partir de très peu d’images et qu’il surpasse la meilleure méthode antérieure (un réseau convolutif à fenêtre glissante) lors du défi ISBI de segmentation de structures neuronales dans des piles de microscopie électronique. En utilisant le même réseau entraîné sur des images de microscopie en lumière transmise (contraste de phase et DIC), nous avons remporté le défi ISBI de suivi cellulaire 2015 dans ces catégories avec une large avance. De plus, le réseau est rapide. La segmentation d’une image de 512x512 prend moins d’une seconde sur un GPU récent. L’implémentation complète (basée sur Caffe) et les réseaux entraînés sont disponibles à l’adresse http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net.*

## UNet2DModel[[diffusers.UNet2DModel]]

#### diffusers.UNet2DModel[[diffusers.UNet2DModel]]

```python
diffusers.UNet2DModel(sample_size: int | tuple[int, int] | None = None, in_channels: int = 3, out_channels: int = 3, center_input_sample: bool = False, time_embedding_type: str = 'positional', time_embedding_dim: int | None = None, freq_shift: int = 0, flip_sin_to_cos: bool = True, down_block_types: tuple[str, ...] = ('DownBlock2D', 'AttnDownBlock2D', 'AttnDownBlock2D', 'AttnDownBlock2D'), mid_block_type: str | None = 'UNetMidBlock2D', up_block_types: tuple[str, ...] = ('AttnUpBlock2D', 'AttnUpBlock2D', 'AttnUpBlock2D', 'UpBlock2D'), block_out_channels: tuple[int, ...] = (224, 448, 672, 896), layers_per_block: int = 2, mid_block_scale_factor: float = 1, downsample_padding: int = 1, downsample_type: str = 'conv', upsample_type: str = 'conv', dropout: float = 0.0, act_fn: str = 'silu', attention_head_dim: int | None = 8, norm_num_groups: int = 32, attn_norm_num_groups: int | None = None, norm_eps: float = 1e-05, resnet_time_scale_shift: str = 'default', add_attention: bool = True, class_embed_type: str | None = None, num_class_embeds: int | None = None, num_train_timesteps: int | None = None)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/unets/unet_2d.py#L39)

**Paramètres :**

sample_size (`int` ou `tuple[int, int]`, *facultatif*, valeur par défaut `None`) : Hauteur et largeur de l'échantillon d'entrée/sortie. Les dimensions doivent être un multiple de `2 ** (len(block_out_channels) - 1)`.

in_channels (`int`, *facultatif*, valeur par défaut 3) : Nombre de canaux dans l'échantillon d'entrée.

out_channels (`int`, *facultatif*, valeur par défaut 3) : Nombre de canaux dans la sortie.

center_input_sample (`bool`, *facultatif*, par défaut `False`) : Indique s'il faut centrer l'échantillon d'entrée.

time_embedding_type (`str`, *facultatif*, par défaut `"positional"`) : Type d'incorporation temporelle à utiliser.

freq_shift (`int`, *facultatif*, valeur par défaut 0) : Décalage de fréquence pour l'incorporation temporelle de Fourier.

flip_sin_to_cos (`bool`, *facultatif*, par défaut `True`) : Indique s'il faut inverser sin en cos pour l'incorporation temporelle de Fourier.

down_block_types (`tuple[str]`, *facultatif*, par défaut `("DownBlock2D", "AttnDownBlock2D", "AttnDownBlock2D", "AttnDownBlock2D")`) : tuple des types de blocs de sous-échantillonnage.

mid_block_type (`str`, *facultatif*, valeur par défaut `"UNetMidBlock2D"`) : Type de bloc pour la partie centrale du UNet, il peut être soit `UNetMidBlock2D` soit `None`.

up_block_types (`tuple[str]`, *facultatif*, par défaut `("AttnUpBlock2D", "AttnUpBlock2D", "AttnUpBlock2D", "UpBlock2D")`) : tuple de types de blocs de suréchantillonnage.

block_out_channels (`tuple[int]`, *facultatif*, par défaut `(224, 448, 672, 896)`) : tuple des canaux de sortie des blocs.

layers_per_block (`int`, *facultatif*, par défaut `2`) : Le nombre de couches par bloc.

mid_block_scale_factor (`float`, *facultatif*, par défaut `1`) : Le facteur d'échelle pour le bloc intermédiaire.

downsample_padding (`int`, *facultatif*, par défaut `1`) : Le padding pour la convolution de downsampling.

downsample_type (`str`, *facultatif*, par défaut `conv`) : Le type de downsampling pour les couches de downsampling. Choisissez entre "conv" et "resnet"

upsample_type (`str`, *facultatif*, par défaut `conv`) : Le type de suréchantillonnage pour les couches de suréchantillonnage. Choisissez entre "conv" et "resnet"

dropout (`float`, *facultatif*, par défaut 0.0) : La probabilité de dropout à utiliser.

act_fn (`str`, *facultatif*, par défaut `"silu"`) : La fonction d'activation à utiliser.

attention_head_dim (`int`, *facultatif*, par défaut `8`) : La dimension des têtes d'attention.

norm_num_groups (`int`, *facultatif*, par défaut `32`) : Le nombre de groupes pour la normalisation.

attn_norm_num_groups (`int`, *facultatif*, valeur par défaut `None`) : Si défini sur un entier, une couche de group norm sera créée dans la couche `Attention` du bloc intermédiaire avec le nombre de groupes indiqué. Si laissé à `None`, la couche de group norm ne sera créée que si `resnet_time_scale_shift` est défini sur `default`, et, dans ce cas, elle aura `norm_num_groups` groupes.

norm_eps (`float`, *facultatif*, par défaut `1e-5`) : L'épsilon pour la normalisation.

resnet_time_scale_shift (`str`, *facultatif*, valeur par défaut `"default"`) : configuration du décalage d'échelle temporelle pour les blocs ResNet (voir `ResnetBlock2D`). Choisissez entre `default` et `scale_shift`.

class_embed_type (`str`, *facultatif*, valeur par défaut `None`) : Le type d'embedding de classe à utiliser, qui est finalement additionné aux embeddings temporels. Choisissez parmi `None`, `"timestep"` ou `"identity"`.

num_class_embeds (`int`, *facultatif*, valeur par défaut `None`) : Dimension d'entrée de la matrice d'incorporation apprenable à projeter vers `time_embed_dim` lors de l'utilisation d'un conditionnement par classe avec `class_embed_type` égal à `None`.

Un modèle UNet 2D qui prend un échantillon bruité et un pas de temps en entrée et renvoie une sortie de la même forme que l'échantillon.

Ce modèle hérite de [ModelMixin](/docs/diffusers/v0.43.0/fr/api/models/overview#diffusers.ModelMixin). Consultez la documentation de la classe parente pour ses méthodes génériques implémentées pour tous les modèles (tels que le téléchargement ou l'enregistrement).

#### forward[[diffusers.UNet2DModel.forward]]

```python
forward(sample: Tensor, timestep: typing.Union[torch.Tensor, float, int], class_labels: typing.Optional[torch.Tensor] = None, return_dict: bool = True)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/unets/unet_2d.py#L249)

**Paramètres :**

sample (`torch.Tensor`) : Le tenseur d'entrée bruité de la forme suivante `(batch, channel, height, width)`.

timestep (`torch.Tensor` ou `float` ou `int`) : Le nombre de pas de temps pour débruitiser une entrée.

class_labels (`torch.Tensor`, *facultatif*, valeur par défaut `None`) : Étiquettes de classe optionnelles pour le conditionnement. Leurs embeddings seront additionnés aux embeddings du timestep.

return_dict (`bool`, *facultatif*, par défaut `True`) : Indique s'il faut retourner un [UNet2DOutput](/docs/diffusers/v0.43.0/fr/api/models/unet2d#diffusers.models.unets.unet_2d.UNet2DOutput) plutôt qu'un simple tuple.

**Retourne :** [UNet2DOutput](/docs/diffusers/v0.43.0/fr/api/models/unet2d#diffusers.models.unets.unet_2d.UNet2DOutput) ou `tuple`

Si `return_dict` est True, un [UNet2DOutput](/docs/diffusers/v0.43.0/fr/api/models/unet2d#diffusers.models.unets.unet_2d.UNet2DOutput) est renvoyé, sinon un `tuple` est renvoyé dont le premier élément est le tenseur d'échantillon.

La méthode forward du [UNet2DModel](/docs/diffusers/v0.43.0/fr/api/models/unet2d#diffusers.UNet2DModel).

## UNet2DOutput[[diffusers.models.unets.unet_2d.UNet2DOutput]]

#### diffusers.models.unets.unet_2d.UNet2DOutput[[diffusers.models.unets.unet_2d.UNet2DOutput]]

```python
diffusers.models.unets.unet_2d.UNet2DOutput(sample: Tensor)
```

[Source](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/unets/unet_2d.py#L27)

**Paramètres :**

sample (`torch.Tensor` de forme `(batch_size, num_channels, height, width)`) : Les états cachés en sortie de la dernière couche du modèle.

La sortie de [UNet2DModel](/docs/diffusers/v0.43.0/fr/api/models/unet2d#diffusers.UNet2DModel).

