# Dilated Neighborhood Attention Transformer

## Resumen

DiNAT fue propuesto en [Dilated Neighborhood Attention Transformer](https://huggingface.co/papers/2209.15001) por Ali Hassani y Humphrey Shi.

Amplía [NAT](https://huggingface.co/papers/2204.07143) añadiendo un patrón de Dilated Neighborhood Attention para capturar el contexto global, y muestra mejoras significativas de rendimiento en comparación con este.

El resumen del artículo es el siguiente:

*Los Transformers se están convirtiendo rápidamente en una de las arquitecturas de deep learning más aplicadas en diversas modalidades, dominios y tareas. En visión, además de los esfuerzos continuos en transformers planos, los transformers jerárquicos también han ganado una atención significativa gracias a su rendimiento y a su fácil integración en marcos de trabajo existentes. Estos modelos suelen emplear mecanismos de atención localizados, como la Neighborhood Attention (NA) de ventana deslizante o la Shifted Window Self Attention de Swin Transformer. Si bien son efectivos para reducir la complejidad cuadrática de la autoatención, la atención local debilita dos de las propiedades más deseables de la autoatención: la modelización de interdependencias de largo alcance y el campo receptivo global. En este artículo, presentamos la Dilated Neighborhood Attention (DiNA), una extensión natural, flexible y eficiente de la NA que puede capturar un contexto más global y expandir los campos receptivos de forma exponencial sin coste adicional. La atención local de la NA y la atención global dispersa de la DiNA se complementan entre sí, por lo que presentamos el Dilated Neighborhood Attention Transformer (DiNAT), un nuevo transformer jerárquico de visión construido sobre ambas. Las variantes de DiNAT disfrutan de mejoras significativas frente a líneas base sólidas como NAT, Swin y ConvNeXt. Nuestro modelo grande es más rápido y supera a su equivalente de Swin en 1,5 % de box AP en la detección de objetos de COCO, 1,3 % de mask AP en la segmentación de instancias de COCO y 1,1 % de mIoU en la segmentación semántica de ADE20K. Combinado con nuevos marcos de trabajo, nuestra variante grande es el nuevo modelo de segmentación panóptica de estado del arte en COCO (58,2 PQ) y ADE20K (48,5 PQ), y el modelo de segmentación de instancias en Cityscapes (44,5 AP) y ADE20K (35,4 AP) (sin datos adicionales). También iguala a los modelos especializados de segmentación semántica de estado del arte en ADE20K (58,2 mIoU) y ocupa el segundo lugar en Cityscapes (84,5 mIoU) (sin datos adicionales).*

<img
src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/dilated-neighborhood-attention-pattern.jpg"
alt="drawing" width="600"/>

 Atención de vecindad con diferentes valores de dilatación. Tomado del artículo original.

Este modelo fue aportado por [Ali Hassani](https://huggingface.co/alihassanijr). El código original se puede encontrar [aquí](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer).

## Consejos de uso

DiNAT se puede utilizar como *backbone*. Cuando `output_hidden_states = True`, se devolverán tanto `hidden_states` como `reshaped_hidden_states`. Las `reshaped_hidden_states` tienen una forma de `(batch, num_channels, height, width)` en lugar de `(batch_size, height, width, num_channels)`.

Notas:

- DiNAT depende de la implementación de Neighborhood Attention y Dilated Neighborhood Attention de [NATTEN](https://github.com/SHI-Labs/NATTEN/).
Puede instalarlo con ruedas precompiladas para Linux consultando [shi-labs.com/natten](https://shi-labs.com/natten), o compilarlo en su sistema ejecutando `pip install natten`. Tenga en cuenta que esta última opción probablemente tardará en compilarse. NATTEN aún no es compatible con dispositivos Windows.
- Por el momento, solo se admite un tamaño de parche de 4.

## Recursos

Una lista de recursos oficiales de Hugging Face y de la comunidad (indicados por 🌎) para ayudarte a empezar con DiNAT.

- [DinatForImageClassification](/docs/transformers/main/es/model_doc/dinat#transformers.DinatForImageClassification) es compatible con este [cuaderno](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb).
- Véase también: [Guía de la tarea de clasificación de imágenes](../tasks/image_classification)

Si te interesa enviar un recurso para que se incluya aquí, no dudes en abrir una Pull Request y lo revisaremos. Lo ideal es que el recurso demuestre algo nuevo en lugar de duplicar un recurso existente.

## DinatConfig[[transformers.DinatConfig]]

#### transformers.DinatConfig[[transformers.DinatConfig]]

```python
transformers.DinatConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, patch_size: int | list[int] | tuple[int, int] = 4, num_channels: int = 3, embed_dim: int = 64, depths: list[int] | tuple[int, ...] = (3, 4, 6, 5), num_heads: list[int] | tuple[int, ...] = (2, 4, 8, 16), kernel_size: int = 7, dilations: list | tuple | None = None, mlp_ratio: float = 3.0, qkv_bias: bool = True, hidden_dropout_prob: float | int = 0.0, attention_probs_dropout_prob: float | int = 0.0, drop_path_rate: float | int = 0.1, hidden_act: str = 'gelu', initializer_range: float = 0.02, layer_norm_eps: float = 1e-05, layer_scale_init_value: float = 0.0, _out_features: list[str] | None = None, _out_indices: list[int] | None = None)
```

[Fuente](https://github.com/huggingface/transformers/blob/main/src/transformers/models/dinat/configuration_dinat.py#L25)

**Parámetros:**

patch_size (`Union[int, list[int], tuple[int, int]]`, *opcional*, valor predeterminado `4`) : El tamaño (resolución) de cada parche.

num_channels (`int`, *opcional*, valor predeterminado `3`) : El número de canales de entrada.

embed_dim (`int`, *opcional*, valor predeterminado `64`) : Dimensionalidad de las incrustaciones y los estados ocultos.

depths (`Union[list[int], tuple[int, ...]]`, *opcional*, valor predeterminado `(3, 4, 6, 5)`) : Profundidad de cada capa en el Transformer.

num_heads (`Union[list[int], tuple[int, ...]]`, *opcional*, valor predeterminado `(2, 4, 8, 16)`) : Número de cabezas de atención para cada capa de atención en el decodificador Transformer.

kernel_size (`int`, *opcional*, valor predeterminado `7`) : El tamaño del kernel de convolución.

dilations (`list[list[int]]`, *opcional*, valor predeterminado `[[1, 8, 1], [1, 4, 1, 4], [1, 2, 1, 2, 1, 2], [1, 1, 1, 1, 1]]`) : Valor de dilatación de cada capa NA en el codificador Transformer.

mlp_ratio (`float`, *opcional*, valor predeterminado `3.0`) : Proporción entre la dimensión oculta del MLP y la dimensión de incrustación.

qkv_bias (`bool`, *opcional*, valor predeterminado `True`) : Indica si se debe añadir un sesgo a las consultas, claves y valores.

hidden_dropout_prob (`Union[float, int]`, *opcional*, valor predeterminado `0.0`) : La probabilidad de dropout para todas las capas completamente conectadas en los embeddings, el codificador y el pooler.

attention_probs_dropout_prob (`Union[float, int]`, *opcional*, valor predeterminado `0.0`) : La proporción de dropout para las probabilidades de atención.

drop_path_rate (`Union[float, int]`, *opcional*, valor predeterminado `0.1`) : Tasa de drop path para la fusión de parches.

hidden_act (`str`, *opcional*, valor predeterminado `gelu`) : La función de activación no lineal (función o cadena) en el decodificador. Por ejemplo, `"gelu"`, `"relu"`, `"silu"`, etc.

initializer_range (`float`, *opcional*, valor predeterminado `0.02`) : La desviación estándar de truncated_normal_initializer para inicializar todas las matrices de pesos.

layer_norm_eps (`float`, *opcional*, valor predeterminado `1e-05`) : El epsilon utilizado por las capas de normalización de capas.

layer_scale_init_value (`float`, *opcional*, valor predeterminado `0.0`) : Escala a utilizar en las capas de autoatención. 0.1 para base, 1e-6 para grande. Establezca 0 para deshabilitar la escala de capa.

Esta es la clase de configuración para almacenar la configuración de un DinatModel. Se utiliza para instanciar un modelo Dinat según los argumentos especificados, definiendo la arquitectura del modelo. Instanciar una configuración con los valores predeterminados producirá una configuración similar a la de [shi-labs/dinat-mini-in1k-224](https://huggingface.co/shi-labs/dinat-mini-in1k-224)

Los objetos de configuración heredan de [PreTrainedConfig](/docs/transformers/main/es/main_classes/configuration#transformers.PreTrainedConfig) y se pueden utilizar para controlar las salidas del modelo. Consulte la documentación de [PreTrainedConfig](/docs/transformers/main/es/main_classes/configuration#transformers.PreTrainedConfig) para obtener más información.

Ejemplo:

```python
>>> from transformers import DinatConfig, DinatModel

>>> # Initializing a Dinat shi-labs/dinat-mini-in1k-224 style configuration
>>> configuration = DinatConfig()

>>> # Initializing a model (with random weights) from the shi-labs/dinat-mini-in1k-224 style configuration
>>> model = DinatModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

## DinatModel[[transformers.DinatModel]]

#### transformers.DinatModel[[transformers.DinatModel]]

```python
transformers.DinatModel(config: DinatConfig, add_pooling_layer = True)
```

[Fuente](https://github.com/huggingface/transformers/blob/main/src/transformers/models/dinat/modeling_dinat.py#L541)

**Parámetros:**

config ([DinatConfig](/docs/transformers/main/es/model_doc/dinat#transformers.DinatConfig)) : Clase de configuración del modelo con todos los parámetros del modelo. Inicializar con un archivo de configuración no carga los pesos asociados con el modelo, solo la configuración. Consulte el método [from_pretrained()](/docs/transformers/main/es/main_classes/model#transformers.PreTrainedModel.from_pretrained) para cargar los pesos del modelo.

add_pooling_layer (`bool`, *opcional*, valor predeterminado `True`) : Si se debe añadir una capa de pooling

El modelo Dinat básico que emite estados ocultos sin ninguna cabeza específica en la parte superior.

Este modelo hereda de [PreTrainedModel](/docs/transformers/main/es/main_classes/model#transformers.PreTrainedModel). Consulte la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos sus modelos (como la descarga o el guardado, el redimensionamiento de las incrustaciones de entrada, la poda de cabezas, etc.).

Este modelo también es una subclase de [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) de PyTorch. Úsalo como un módulo de PyTorch regular y consulta la documentación de PyTorch para todo lo relacionado con el uso y el comportamiento generales.

#### forward[[transformers.DinatModel.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, output_attentions: bool | None = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Fuente](https://github.com/huggingface/transformers/blob/main/src/transformers/models/dinat/modeling_dinat.py#L567)

**Parámetros:**

pixel_values (`torch.Tensor` de forma `(batch_size, num_channels, image_size, image_size)`, *opcional*) : Los tensores correspondientes a las imágenes de entrada. Los valores de píxeles se pueden obtener usando [ViTImageProcessor](/docs/transformers/main/es/model_doc/vit#transformers.ViTImageProcessor). Consulte [ViTImageProcessor.__call__()](/docs/transformers/main/es/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) para obtener más detalles (`processor_class` utiliza [ViTImageProcessor](/docs/transformers/main/es/model_doc/vit#transformers.ViTImageProcessor) para procesar las imágenes).

output_attentions (`bool`, *opcional*) : Indica si se deben devolver los tensores de atención de todas las capas de atención. Consulte `attentions` en los tensores devueltos para obtener más detalles.

output_hidden_states (`bool`, *opcional*) : Indica si se deben devolver los estados ocultos de todas las capas. Consulte `hidden_states` en los tensores devueltos para obtener más detalles.

return_dict (`bool`, *opcional*) : Indica si se debe devolver un [ModelOutput](/docs/transformers/main/es/main_classes/output#transformers.utils.ModelOutput) en lugar de una tupla simple.

**Devuelve:** `DinatModelOutput` o `tuple(torch.Tensor)`

Un `DinatModelOutput` o una tupla de `torch.Tensor` (si se pasa `return_dict=False` o cuando `config.return_dict=False`) que comprende varios elementos según la configuración ([DinatConfig](/docs/transformers/main/es/model_doc/dinat#transformers.DinatConfig)) y las entradas.

El método forward de [DinatModel](/docs/transformers/main/es/model_doc/dinat#transformers.DinatModel) sobrescribe el método especial `__call__`.

Aunque la receta para la pasada hacia adelante debe definirse dentro de esta función, se debe llamar a la instancia de `Module` después, en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de preprocesamiento y posprocesamiento, mientras que la segunda los ignora silenciosamente.

- **last_hidden_state** (`torch.Tensor` de forma `(batch_size, sequence_length, hidden_size)`, *opcional*) -- Secuencia de estados ocultos en la salida de la última capa del modelo.
- **pooler_output** (`torch.Tensor` de forma `(batch_size, hidden_size)`, *opcional*, se devuelve cuando se pasa `add_pooling_layer=True`) -- Promedio de pooling del estado oculto de la última capa.
- **hidden_states** (`tuple[torch.Tensor, ...]`, *opcional*, se devuelve cuando se pasa `output_hidden_states=True` o cuando `config.output_hidden_states=True`) -- Tupla de `torch.Tensor` (una para la salida de las incrustaciones, si el modelo tiene una capa de incrustaciones, + una para la salida de cada capa) de forma `(batch_size, sequence_length, hidden_size)`.

  Estados ocultos del modelo en la salida de cada capa más las salidas opcionales de la incrustación inicial.
- **attentions** (`tuple[torch.Tensor, ...]`, *opcional*, se devuelve cuando se pasa `output_attentions=True` o cuando `config.output_attentions=True`) -- Tupla de `torch.Tensor` (una por cada capa) de forma `(batch_size, num_heads, sequence_length, sequence_length)`.

  Pesos de atención tras el softmax de atención, utilizados para calcular la media ponderada en las cabezas de autoatención.
- **reshaped_hidden_states** (`tuple(torch.Tensor)`, *opcional*, se devuelve cuando se pasa `output_hidden_states=True` o cuando `config.output_hidden_states=True`) -- Tupla de `torch.Tensor` (una para la salida de los embeddings + una para la salida de cada etapa) de forma `(batch_size, hidden_size, height, width)`.

  Estados ocultos del modelo en la salida de cada capa, más las salidas de la incrustación inicial reconfiguradas para incluir las dimensiones espaciales.

Ejemplo:

```python
```

## DinatForImageClassification[[transformers.DinatForImageClassification]]

#### transformers.DinatForImageClassification[[transformers.DinatForImageClassification]]

```python
transformers.DinatForImageClassification(config: DinatConfig)
```

[Fuente](https://github.com/huggingface/transformers/blob/main/src/transformers/models/dinat/modeling_dinat.py#L622)

**Parámetros:**

config ([DinatConfig](/docs/transformers/main/es/model_doc/dinat#transformers.DinatConfig)) : Clase de configuración del modelo con todos los parámetros del modelo. Inicializar con un archivo de configuración no carga los pesos asociados con el modelo, solo la configuración. Consulte el método [from_pretrained()](/docs/transformers/main/es/main_classes/model#transformers.PreTrainedModel.from_pretrained) para cargar los pesos del modelo.

Modelo Dinat transformer con una cabeza de clasificación de imágenes en la parte superior (una capa lineal sobre el estado oculto final del token [CLS]), por ejemplo, para ImageNet.

Este modelo hereda de [PreTrainedModel](/docs/transformers/main/es/main_classes/model#transformers.PreTrainedModel). Consulte la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos sus modelos (como la descarga o el guardado, el redimensionamiento de las incrustaciones de entrada, la poda de cabezas, etc.).

Este modelo también es una subclase de [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) de PyTorch. Úsalo como un módulo de PyTorch regular y consulta la documentación de PyTorch para todo lo relacionado con el uso y el comportamiento generales.

#### forward[[transformers.DinatForImageClassification.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, labels: typing.Optional[torch.LongTensor] = None, output_attentions: bool | None = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Fuente](https://github.com/huggingface/transformers/blob/main/src/transformers/models/dinat/modeling_dinat.py#L639)

**Parámetros:**

pixel_values (`torch.Tensor` de forma `(batch_size, num_channels, image_size, image_size)`, *opcional*) : Los tensores correspondientes a las imágenes de entrada. Los valores de píxeles se pueden obtener usando [ViTImageProcessor](/docs/transformers/main/es/model_doc/vit#transformers.ViTImageProcessor). Consulte [ViTImageProcessor.__call__()](/docs/transformers/main/es/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) para obtener más detalles (`processor_class` utiliza [ViTImageProcessor](/docs/transformers/main/es/model_doc/vit#transformers.ViTImageProcessor) para procesar las imágenes).

labels (`torch.LongTensor` de forma `(batch_size,)`, *opcional*) : Etiquetas para calcular la pérdida de clasificación/regresión de imagen. Los índices deben estar en `[0, ..., config.num_labels - 1]`. Si `config.num_labels == 1` se calcula una pérdida de regresión (pérdida de error cuadrático medio), si `config.num_labels > 1` se calcula una pérdida de clasificación (entropía cruzada).

output_attentions (`bool`, *opcional*) : Indica si se deben devolver los tensores de atención de todas las capas de atención. Consulte `attentions` en los tensores devueltos para obtener más detalles.

output_hidden_states (`bool`, *opcional*) : Indica si se deben devolver los estados ocultos de todas las capas. Consulte `hidden_states` en los tensores devueltos para obtener más detalles.

return_dict (`bool`, *opcional*) : Indica si se debe devolver un [ModelOutput](/docs/transformers/main/es/main_classes/output#transformers.utils.ModelOutput) en lugar de una tupla simple.

**Devuelve:** `DinatImageClassifierOutput` o `tuple(torch.Tensor)`

Un `DinatImageClassifierOutput` o una tupla de `torch.Tensor` (si se pasa `return_dict=False` o cuando `config.return_dict=False`) que comprende varios elementos según la configuración ([DinatConfig](/docs/transformers/main/es/model_doc/dinat#transformers.DinatConfig)) y las entradas.

El método forward de [DinatForImageClassification](/docs/transformers/main/es/model_doc/dinat#transformers.DinatForImageClassification) sobrescribe el método especial `__call__`.

Aunque la receta para la pasada hacia adelante debe definirse dentro de esta función, se debe llamar a la instancia de `Module` después, en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de preprocesamiento y posprocesamiento, mientras que la segunda los ignora silenciosamente.

- **loss** (`torch.Tensor` de forma `(1,)`, *opcional*, se devuelve cuando se proporciona `labels`) -- Pérdida de clasificación (o de regresión si config.num_labels==1).
- **logits** (`torch.Tensor` de forma `(batch_size, config.num_labels)`) -- Puntuaciones de clasificación (o de regresión si config.num_labels==1) (antes de SoftMax).
- **hidden_states** (`tuple[torch.Tensor, ...]`, *opcional*, se devuelve cuando se pasa `output_hidden_states=True` o cuando `config.output_hidden_states=True`) -- Tupla de `torch.Tensor` (una para la salida de las incrustaciones, si el modelo tiene una capa de incrustaciones, + una para la salida de cada capa) de forma `(batch_size, sequence_length, hidden_size)`.

  Estados ocultos del modelo en la salida de cada capa más las salidas opcionales de la incrustación inicial.
- **attentions** (`tuple[torch.Tensor, ...]`, *opcional*, se devuelve cuando se pasa `output_attentions=True` o cuando `config.output_attentions=True`) -- Tupla de `torch.Tensor` (una por cada capa) de forma `(batch_size, num_heads, sequence_length, sequence_length)`.

  Pesos de atención tras el softmax de atención, utilizados para calcular la media ponderada en las cabezas de autoatención.
- **reshaped_hidden_states** (`tuple(torch.Tensor)`, *opcional*, se devuelve cuando se pasa `output_hidden_states=True` o cuando `config.output_hidden_states=True`) -- Tupla de `torch.Tensor` (una para la salida de los embeddings + una para la salida de cada etapa) de forma `(batch_size, hidden_size, height, width)`.

  Estados ocultos del modelo en la salida de cada capa, más las salidas de la incrustación inicial reconfiguradas para incluir las dimensiones espaciales.

Ejemplo:

```python
>>> from transformers import AutoImageProcessor, DinatForImageClassification
>>> import torch
>>> from datasets import load_dataset

>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]

>>> image_processor = AutoImageProcessor.from_pretrained("shi-labs/dinat-mini-in1k-224")
>>> model = DinatForImageClassification.from_pretrained("shi-labs/dinat-mini-in1k-224")

>>> inputs = image_processor(image, return_tensors="pt")

>>> with torch.no_grad():
...     logits = model(**inputs).logits

>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
...
```

