Transformers documentation
MobileViTV2
Este modelo se publicó en HF papers el 2022-06-06 y se contribuyó a Hugging Face Transformers el 2023-06-02.
MobileViTV2
Resumen
El modelo MobileViTV2 fue propuesto en Separable Self-attention for Mobile Vision Transformers por Sachin Mehta y Mohammad Rastegari.
MobileViTV2 es la segunda versión de MobileViT, construida reemplazando la autoatención multi-cabeza de MobileViT con autoatención separable.
El resumen del artículo es el siguiente:
Los transformers de visión móvil (MobileViT) pueden lograr un rendimiento de última generación en varias tareas de visión móvil, incluida la clasificación y la detección. Aunque estos modelos tienen menos parámetros, presentan una latencia alta en comparación con los modelos basados en redes neuronales convolucionales. El principal cuello de botella de eficiencia en MobileViT es la autoatención multi-cabeza (MHA) en los transformers, que requiere una complejidad temporal de O(k2) con respecto al número de tokens (o parches) k. Además, la MHA requiere operaciones costosas (por ejemplo, multiplicación de matrices por lotes) para calcular la autoatención, lo que afecta la latencia en dispositivos con recursos limitados. Este artículo introduce un método de autoatención separable con complejidad lineal, es decir, O(k). Una característica simple pero efectiva del método propuesto es que utiliza operaciones elemento a elemento para calcular la autoatención, lo que lo convierte en una buena opción para dispositivos con recursos limitados. El modelo mejorado, MobileViTV2, es de última generación en varias tareas de visión móvil, incluida la clasificación de objetos en ImageNet y la detección de objetos en MS-COCO. Con aproximadamente tres millones de parámetros, MobileViTV2 logra una precisión top-1 del 75,6 % en el conjunto de datos ImageNet, superando a MobileViT en aproximadamente un 1 % mientras se ejecuta 3,2 veces más rápido en un dispositivo móvil.
Este modelo fue aportado por shehan97. El código original se puede encontrar aquí.
Consejos de uso
- MobileViTV2 se parece más a una CNN que a un modelo Transformer. No funciona con datos de secuencias, sino con lotes de imágenes. A diferencia de ViT, no hay embeddings. El modelo backbone genera un mapa de características.
- Se puede usar MobileViTImageProcessor para preparar las imágenes para el modelo. Tenga en cuenta que si realiza su propio preprocesamiento, los puntos de control preentrenados esperan que las imágenes estén en orden de píxeles BGR (no RGB).
- Los puntos de control de clasificación de imágenes disponibles están preentrenados en ImageNet-1k (también conocido como ILSVRC 2012, una colección de 1,3 millones de imágenes y 1.000 clases).
- El modelo de segmentación utiliza una cabeza DeepLabV3. Los puntos de control de segmentación semántica disponibles están preentrenados en PASCAL VOC.
MobileViTV2Config
clase transformers.MobileViTV2Config
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonenum_channels: int = 3image_size: int | list[int] | tuple[int, int] = 256patch_size: int | list[int] | tuple[int, int] = 2expand_ratio: float = 2.0hidden_act: str = 'swish'conv_kernel_size: int = 3output_stride: int = 32classifier_dropout_prob: float | int = 0.1initializer_range: float = 0.02layer_norm_eps: float = 1e-05aspp_out_channels: int = 512atrous_rates: list[int] | tuple[int, ...] = (6, 12, 18)aspp_dropout_prob: float | int = 0.1semantic_loss_ignore_index: int = 255n_attn_blocks: list[int] | tuple[int, ...] = (2, 4, 3)base_attn_unit_dims: list[int] | tuple[int, ...] = (128, 192, 256)width_multiplier: float | int = 1.0ffn_multiplier: int = 2attn_dropout: float | int = 0.0ffn_dropout: float | int = 0.0 )
Parámetros
- num_channels (
int, opcional, valor predeterminado3) — El número de canales de entrada. - image_size (
Union[int, list[int], tuple[int, int]], opcional, valor predeterminado256) — El tamaño (resolución) de cada imagen. - patch_size (
Union[int, list[int], tuple[int, int]], opcional, valor predeterminado2) — El tamaño (resolución) de cada parche. - expand_ratio (
float, opcional, valor predeterminado2.0) — Ratio de expansión para establecer las dimensiones de salida de la expansión - hidden_act (
str, opcional, valor predeterminadoswish) — La función de activación no lineal (función o cadena) en el decodificador. Por ejemplo,"gelu","relu","silu", etc. - conv_kernel_size (
int, opcional, valor predeterminado3) — El tamaño del kernel de convolución. - output_stride (
int, opcional, valor predeterminado32) — La proporción entre la resolución espacial de los mapas de características de entrada y salida. - classifier_dropout_prob (
Union[float, int], opcional, valor predeterminado0.1) — La proporción de dropout para el clasificador. - initializer_range (
float, opcional, valor predeterminado0.02) — La desviación estándar del truncated_normal_initializer para inicializar todas las matrices de pesos. - layer_norm_eps (
float, opcional, valor predeterminado1e-05) — El epsilon utilizado por las capas de normalización de capa. - aspp_out_channels (
int, opcional, valor predeterminado 512) — Número de canales de salida utilizados en la capa ASPP para la segmentación semántica. - atrous_rates (
list[int], opcional, valor predeterminado[6, 12, 18]) — Factores de dilatación (atrous) utilizados en la capa ASPP para la segmentación semántica. - aspp_dropout_prob (
float, opcional, valor predeterminado 0.1) — La proporción de dropout para la capa ASPP en la segmentación semántica. - semantic_loss_ignore_index (
int, opcional, valor predeterminado255) — El índice que se ignora en la función de pérdida del modelo de segmentación semántica. - n_attn_blocks (
list[int], opcional, valor predeterminado[2, 4, 3]) — El número de bloques de atención en cada MobileViTV2Layer - base_attn_unit_dims (
list[int], opcional, valor predeterminado[128, 192, 256]) — El multiplicador base para las dimensiones de los bloques de atención en cada MobileViTV2Layer - width_multiplier (
float, opcional, valor predeterminado 1.0) — El multiplicador de ancho para MobileViTV2. - ffn_multiplier (
int, opcional, valor predeterminado 2) — El multiplicador de FFN para MobileViTV2. - attn_dropout (
Union[float, int], opcional, valor predeterminado0.0) — La proporción de dropout para las probabilidades de atención. - ffn_dropout (
float, opcional, valor predeterminado 0.0) — El dropout entre las capas FFN.
Esta es la clase de configuración para almacenar la configuración de un MobileViTV2Model. Se utiliza para instanciar un modelo Mobilevitv2 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 apple/mobilevitv2-1.0
Los objetos de configuración heredan de PreTrainedConfig y se pueden usar para controlar las salidas del modelo. Lea la documentación de PreTrainedConfig para obtener más información.
Ejemplo:
>>> from transformers import MobileViTV2Config, MobileViTV2Model
>>> # Initializing a mobilevitv2-small style configuration
>>> configuration = MobileViTV2Config()
>>> # Initializing a model from the mobilevitv2-small style configuration
>>> model = MobileViTV2Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configMobileViTV2Model
clase transformers.MobileViTV2Model
< source >( config: MobileViTV2Configexpand_output: bool = True )
Parámetros
- config (MobileViTV2Config) — 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() para cargar los pesos del modelo.
- expand_output (
bool, opcional, valor predeterminadoTrue) — Si se debe expandir la salida del modelo. Si esTrue, el modelo emitirá características agrupadas además de los estados ocultos. Si esFalse, solo se devolverán los estados ocultos.
El modelo Mobilevitv2 básico que emite estados ocultos sin ningún cabezal específico en la parte superior.
Este modelo hereda de PreTrainedModel. Consulta 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 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
< source >( pixel_values: typing.Optional[torch.Tensor] = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → BaseModelOutputWithPoolingAndNoAttention or tuple(torch.Tensor)
Parámetros
- pixel_values (
torch.Tensorde 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 utilizando MobileViTImageProcessor. Consulte MobileViTImageProcessor.call() para más detalles (processor_classutiliza MobileViTImageProcessor para procesar las imágenes). - output_hidden_states (
bool, opcional) — Indica si se deben devolver los estados ocultos de todas las capas. Consultehidden_statesen los tensores devueltos para obtener más detalles. - return_dict (
bool, opcional) — Indica si se debe devolver un ModelOutput en lugar de una tupla simple.
Devuelve
BaseModelOutputWithPoolingAndNoAttention o tuple(torch.Tensor)
Un BaseModelOutputWithPoolingAndNoAttention 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 (MobileViTV2Config) y las entradas.
El método forward de MobileViTV2Model 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
Moduledespués en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de pre y postprocesamiento, mientras que la segunda los ignora silenciosamente.
last_hidden_state (
torch.Tensorde forma(batch_size, num_channels, height, width)) — Secuencia de estados ocultos en la salida de la última capa del modelo.pooler_output (
torch.Tensorde forma(batch_size, hidden_size)) — Estado oculto de la última capa después de una operación de agrupación en las dimensiones espaciales.hidden_states (
tuple(torch.Tensor), opcional, devuelto cuando se pasaoutput_hidden_states=Trueo cuandoconfig.output_hidden_states=True) — Tupla detorch.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, num_channels, height, width).Estados ocultos del modelo en la salida de cada capa más las salidas opcionales de la incrustación inicial.
MobileViTV2ForImageClassification
clase transformers.MobileViTV2ForImageClassification
< source >( config: MobileViTV2Config )
Parámetros
- config (MobileViTV2Config) — 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() para cargar los pesos del modelo.
Modelo MobileViTV2 con una cabeza de clasificación de imágenes en la parte superior (una capa lineal sobre las características agrupadas), por ejemplo, para ImageNet.
Este modelo hereda de PreTrainedModel. Consulta 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 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
< source >( pixel_values: typing.Optional[torch.Tensor] = Noneoutput_hidden_states: bool | None = Nonelabels: typing.Optional[torch.Tensor] = Nonereturn_dict: bool | None = None**kwargs ) → ImageClassifierOutputWithNoAttention or tuple(torch.Tensor)
Parámetros
- pixel_values (
torch.Tensorde 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 utilizando MobileViTImageProcessor. Consulte MobileViTImageProcessor.call() para más detalles (processor_classutiliza MobileViTImageProcessor para procesar las imágenes). - output_hidden_states (
bool, opcional) — Indica si se deben devolver los estados ocultos de todas las capas. Consultehidden_statesen los tensores devueltos para obtener más detalles. - labels (
torch.LongTensorde forma(batch_size,), opcional) — Etiquetas para calcular la pérdida de clasificación/regresión de imágenes. Los índices deben estar en[0, ..., config.num_labels - 1]. Siconfig.num_labels == 1se calcula una pérdida de regresión (pérdida de error cuadrático medio), siconfig.num_labels > 1se calcula una pérdida de clasificación (entropía cruzada). - return_dict (
bool, opcional) — Indica si se debe devolver un ModelOutput en lugar de una tupla simple.
Devuelve
ImageClassifierOutputWithNoAttention o tuple(torch.Tensor)
Un ImageClassifierOutputWithNoAttention 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 (MobileViTV2Config) y las entradas.
El método forward de MobileViTV2ForImageClassification reemplaza 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
Moduledespués en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de pre y postprocesamiento, mientras que la segunda los ignora silenciosamente.
- loss (
torch.Tensorde forma(1,), opcional, se devuelve cuando se proporcionalabels) — Pérdida de clasificación (o de regresión si config.num_labels==1). - logits (
torch.Tensorde 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, devuelto cuando se pasaoutput_hidden_states=Trueo cuandoconfig.output_hidden_states=True) — Tupla detorch.Tensor(una para la salida de las incrustaciones, si el modelo tiene una capa de incrustación, + una para la salida de cada etapa) de forma(batch_size, num_channels, height, width). Estados ocultos (también llamados mapas de características) del modelo en la salida de cada etapa.
Ejemplo:
>>> from transformers import AutoImageProcessor, MobileViTV2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("apple/mobilevitv2-1.0")
>>> model = MobileViTV2ForImageClassification.from_pretrained("apple/mobilevitv2-1.0")
>>> 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])
...MobileViTV2ForSemanticSegmentation
clase transformers.MobileViTV2ForSemanticSegmentation
< source >( config: MobileViTV2Config )
Parámetros
- config (MobileViTV2Config) — 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() para cargar los pesos del modelo.
Modelo MobileViTV2 con una cabeza de segmentación semántica en la parte superior, por ejemplo, para Pascal VOC.
Este modelo hereda de PreTrainedModel. Consulta 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 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
< source >( pixel_values: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.Tensor] = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → SemanticSegmenterOutput or tuple(torch.Tensor)
Parámetros
- pixel_values (
torch.Tensorde 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 utilizando MobileViTImageProcessor. Consulte MobileViTImageProcessor.call() para más detalles (processor_classutiliza MobileViTImageProcessor para procesar las imágenes). - labels (
torch.LongTensorde forma(batch_size, height, width), opcional) — Mapas de segmentación semántica de referencia para calcular la pérdida. Los índices deben estar en[0, ..., config.num_labels - 1]. Siconfig.num_labels > 1, se calcula una pérdida de clasificación (Cross-Entropy). - output_hidden_states (
bool, opcional) — Indica si se deben devolver los estados ocultos de todas las capas. Consultehidden_statesen los tensores devueltos para obtener más detalles. - return_dict (
bool, opcional) — Indica si se debe devolver un ModelOutput en lugar de una tupla simple.
Devuelve
SemanticSegmenterOutput o tuple(torch.Tensor)
Un SemanticSegmenterOutput 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 (MobileViTV2Config) y las entradas.
El método forward de MobileViTV2ForSemanticSegmentation 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
Moduledespués en lugar de a esta, ya que la primera se encarga de ejecutar los pasos de pre y postprocesamiento, mientras que la segunda los ignora silenciosamente.
loss (
torch.Tensorde forma(1,), opcional, se devuelve cuando se proporcionalabels) — Pérdida de clasificación (o de regresión si config.num_labels==1).logits (
torch.Tensorde forma(batch_size, config.num_labels, logits_height, logits_width)) — Puntuaciones de clasificación para cada píxel.Los logits devueltos no tienen necesariamente el mismo tamaño que los
pixel_valuespasados como entradas. Esto se hace para evitar realizar dos interpolaciones y perder algo de calidad cuando un usuario necesita redimensionar los logits al tamaño de la imagen original como procesamiento posterior. Debe comprobar siempre la forma de sus logits y redimensionarlos según sea necesario.hidden_states (
tuple(torch.Tensor), opcional, devuelto cuando se pasaoutput_hidden_states=Trueo cuandoconfig.output_hidden_states=True) — Tupla detorch.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, patch_size, 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 pasaoutput_attentions=Trueo cuandoconfig.output_attentions=True) — Tupla detorch.Tensor(una por cada capa) de forma(batch_size, num_heads, patch_size, sequence_length).Pesos de atención tras el softmax de atención, utilizados para calcular la media ponderada en las cabezas de autoatención.
Ejemplos:
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> import torch
>>> from PIL import Image
>>> from transformers import AutoImageProcessor, MobileViTV2ForSemanticSegmentation
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> with httpx.stream("GET", url) as response:
... image = Image.open(BytesIO(response.read()))
>>> image_processor = AutoImageProcessor.from_pretrained("apple/mobilevitv2-1.0-imagenet1k-256")
>>> model = MobileViTV2ForSemanticSegmentation.from_pretrained("apple/mobilevitv2-1.0-imagenet1k-256")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> # logits are of shape (batch_size, num_labels, height, width)
>>> logits = outputs.logits