# UNet3DConditionModel

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 proprement dit. 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 conditionnel 3D.

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.*

## UNet3DConditionModel[[diffusers.UNet3DConditionModel]]

#### diffusers.UNet3DConditionModel[[diffusers.UNet3DConditionModel]]

```python
diffusers.UNet3DConditionModel(sample_size: int | None = None, in_channels: int = 4, out_channels: int = 4, down_block_types: tuple[str, ...] = ('CrossAttnDownBlock3D', 'CrossAttnDownBlock3D', 'CrossAttnDownBlock3D', 'DownBlock3D'), up_block_types: tuple[str, ...] = ('UpBlock3D', 'CrossAttnUpBlock3D', 'CrossAttnUpBlock3D', 'CrossAttnUpBlock3D'), block_out_channels: tuple[int, ...] = (320, 640, 1280, 1280), layers_per_block: int = 2, downsample_padding: int = 1, mid_block_scale_factor: float = 1, act_fn: str = 'silu', norm_num_groups: int | None = 32, norm_eps: float = 1e-05, cross_attention_dim: int = 1024, attention_head_dim: int | tuple[int] = 64, num_attention_heads: int | tuple[int] | None = None, time_cond_proj_dim: int | None = None)
```

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

**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.

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

out_channels (`int`, *facultatif*, par défaut 4) : Le nombre de canaux dans la sortie.

down_block_types (`tuple[str]`, *facultatif*, par défaut `("CrossAttnDownBlock3D", "CrossAttnDownBlock3D", "CrossAttnDownBlock3D", "DownBlock3D")`) : Le tuple de blocs de sous-échantillonnage à utiliser.

up_block_types (`tuple[str]`, *facultatif*, par défaut `("UpBlock3D", "CrossAttnUpBlock3D", "CrossAttnUpBlock3D", "CrossAttnUpBlock3D")`) : Le tuple de blocs de suréchantillonnage à utiliser.

block_out_channels (`tuple[int]`, *facultatif*, par défaut `(320, 640, 1280, 1280)`) : Le tuple des canaux de sortie pour chaque bloc.

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

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

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

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

norm_num_groups (`int`, *facultatif*, valeur par défaut 32) : Le nombre de groupes à utiliser pour la normalisation. Si `None`, les couches de normalisation et d'activation sont ignorées lors du post-traitement.

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

cross_attention_dim (`int`, *facultatif*, valeur par défaut 1024) : La dimension des fonctionnalités d'attention croisée.

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

num_attention_heads (`int`, *facultatif*) : Le nombre de têtes d'attention.

time_cond_proj_dim (`int`, *facultatif*, par défaut `None`) : La dimension de la couche `cond_proj` dans l'encodage du pas de temps.

Un modèle 3D UNet conditionnel qui prend un échantillon bruité, un état conditionnel 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).

#### disable_freeu[[diffusers.UNet3DConditionModel.disable_freeu]]

```python
disable_freeu()
```

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

Désactive le mécanisme FreeU.

#### enable_forward_chunking[[diffusers.UNet3DConditionModel.enable_forward_chunking]]

```python
enable_forward_chunking(chunk_size: int | None = None, dim: int = 0)
```

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

**Paramètres :**

chunk_size (`int`, *facultatif*) : La taille des blocs des couches feed-forward. Si non spécifiée, la couche feed-forward est exécutée individuellement sur chaque tenseur de dim=`dim`.

dim (`int`, *facultatif*, par défaut `0`) : La dimension sur laquelle le calcul feed-forward doit être découpé. Choisissez entre dim=0 (batch) ou dim=1 (longueur de séquence).

Définit le processeur d'attention à utiliser [feed forward chunking](https://huggingface.co/blog/reformer#2-chunked-feed-forward-layers).

#### enable_freeu[[diffusers.UNet3DConditionModel.enable_freeu]]

```python
enable_freeu(s1, s2, b1, b2)
```

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

**Paramètres :**

s1 (`float`) : Facteur d'échelle pour l'étape 1 afin d'atténuer les contributions des caractéristiques de saut. Cela permet d'atténuer l'« effet de lissage excessif » dans le processus de débruitage amélioré.

s2 (`float`) : Facteur d'échelle pour l'étape 2 afin d'atténuer les contributions des caractéristiques de saut. Cela permet de réduire l'« effet de lissage excessif » dans le processus de débruitage amélioré.

b1 (`float`) : Facteur d'échelle pour l'étape 1 afin d'amplifier les contributions des fonctionnalités du backbone.

b2 (`float`) : Facteur d'échelle pour l'étape 2 afin d'amplifier les contributions des fonctionnalités du backbone.

Active le mécanisme FreeU de https://huggingface.co/papers/2309.11497.

Les suffixes après les facteurs d'échelle représentent les blocs de stades où ils sont appliqués.

Veuillez consulter le [dépôt officiel](https://github.com/ChenyangSi/FreeU) pour les combinaisons de valeurs connues pour fonctionner correctement avec différents pipelines tels que Stable Diffusion v1, v2 et Stable Diffusion XL.

#### forward[[diffusers.UNet3DConditionModel.forward]]

```python
forward(sample: Tensor, timestep: typing.Union[torch.Tensor, float, int], encoder_hidden_states: Tensor, class_labels: typing.Optional[torch.Tensor] = None, timestep_cond: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, cross_attention_kwargs: dict[str, typing.Any] | None = None, down_block_additional_residuals: tuple[torch.Tensor] | None = None, mid_block_additional_residual: typing.Optional[torch.Tensor] = None, return_dict: bool = True)
```

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

**Paramètres :**

sample (`torch.Tensor`) : le tenseur d'entrée bruité de forme `(batch, num_channels, num_frames, height, width`.

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

encoder_hidden_states (`torch.Tensor`) : Les états cachés de l'encodeur avec la forme `(batch, sequence_length, feature_dim)`.

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.

timestep_cond : (`torch.Tensor`, *facultatif*, valeur par défaut `None`) : embeddings conditionnels pour le timestep. S'ils sont fournis, les embeddings seront additionnés aux échantillons passés par la couche `self.time_embedding` pour obtenir les embeddings de timestep.

attention_mask (`torch.Tensor`, *facultatif*, par défaut `None`) : Un masque d'attention de forme `(batch, key_tokens)` est appliqué à `encoder_hidden_states`. Si la valeur est `1`, le masque est conservé ; sinon, si elle est `0`, il est ignoré. Le masque est converti en biais, qui ajoute de grandes valeurs négatives aux scores d'attention correspondant aux jetons « ignorés ».

cross_attention_kwargs (`dict`, *facultatif*) : Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'`AttentionProcessor` tel que défini sous `self.processor` dans [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).

down_block_additional_residuals : (`tuple` de `torch.Tensor`, *facultatif*) : Un tuple de tenseurs qui, s'il est spécifié, est ajouté aux résidus des blocs down du unet.

mid_block_additional_residual : (`torch.Tensor`, *facultatif*) : un tenseur qui, s'il est spécifié, est ajouté au résidu du bloc unet central.

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

cross_attention_kwargs (`dict`, *facultatif*) : Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'`AttnProcessor`.

**Retourne :** [UNet3DConditionOutput](/docs/diffusers/v0.43.0/fr/api/models/unet-motion#diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput) ou `tuple`

Si `return_dict` est True, un [UNet3DConditionOutput](/docs/diffusers/v0.43.0/fr/api/models/unet-motion#diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput) est renvoyé, sinon un `tuple` est renvoyé dont le premier élément est le tenseur d’échantillon.

La méthode forward du [UNet3DConditionModel](/docs/diffusers/v0.43.0/fr/api/models/unet3d-cond#diffusers.UNet3DConditionModel).

#### fuse_qkv_projections[[diffusers.UNet3DConditionModel.fuse_qkv_projections]]

```python
fuse_qkv_projections()
```

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

Active les projections QKV fusionnées. Pour les modules d'auto-attention, toutes les matrices de projection (c'est-à-dire requête, clé, valeur) sont fusionnées. Pour les modules d'attention croisée, les matrices de projection des clés et des valeurs sont fusionnées.

> [!WARNING] > Cette API est 🧪 expérimentale.

#### set_attention_slice[[diffusers.UNet3DConditionModel.set_attention_slice]]

```python
set_attention_slice(slice_size: str | int | list[int])
```

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

**Paramètres :**

slice_size (`str` ou `int` ou `list(int)`, *facultatif*, par défaut `"auto"`) : lorsque la valeur est `"auto"`, l’entrée des têtes d’attention est divisée par deux, de sorte que l’attention est calculée en deux étapes. Si la valeur est `"max"`, la quantité maximale de mémoire est économisée en n’exécutant qu’une seule tranche à la fois. Si un nombre est fourni, autant de tranches sont utilisées que `attention_head_dim // slice_size`. Dans ce cas, `attention_head_dim` doit être un multiple de `slice_size`.

Activer le calcul de l'attention par tranches.

Lorsque cette option est activée, le module d'attention divise le tenseur d'entrée en tranches pour calculer l'attention en plusieurs étapes. Cela est utile pour économiser de la mémoire au prix d'une légère diminution de la vitesse.

#### set_default_attn_processor[[diffusers.UNet3DConditionModel.set_default_attn_processor]]

```python
set_default_attn_processor()
```

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

Désactive les processeurs d'attention personnalisés et définit l'implémentation d'attention par défaut.

#### unfuse_qkv_projections[[diffusers.UNet3DConditionModel.unfuse_qkv_projections]]

```python
unfuse_qkv_projections()
```

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

Désactive la projection QKV fusionnée si elle est activée.

> [!WARNING] > Cette API est 🧪 expérimentale.

## UNet3DConditionOutput[[diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput]]

#### diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput[[diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput]]

```python
diffusers.models.unets.unet_3d_condition.UNet3DConditionOutput(sample: Tensor)
```

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

**Paramètres :**

sample (`torch.Tensor` de forme `(batch_size, num_channels, num_frames, height, width)`) : Les états cachés en sortie, conditionnés par l'entrée `encoder_hidden_states`. Sortie de la dernière couche du modèle.

La sortie de [UNet3DConditionModel](/docs/diffusers/v0.43.0/fr/api/models/unet3d-cond#diffusers.UNet3DConditionModel).

