Transformers documentation

Modèles Vision Encoder Decoder

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Ce modèle a été publié dans les papiers HF le 2021-09-21 et contribué à Hugging Face Transformers le 2021-10-13.

Modèles Vision Encoder Decoder

FlashAttention SDPA

Aperçu

Le VisionEncoderDecoderModel permet d’initialiser un modèle image-vers-texte en utilisant n’importe quel modèle de vision préentraîné basé sur Transformers comme encodeur (par ex. ViT, BEiT, DeiT, Swin) et n’importe quel modèle de langage préentraîné comme décodeur (par ex. RoBERTa, GPT2, BERT, DistilBERT).

L’efficacité de l’initialisation des modèles d’image vers séquence de texte à l’aide de points de contrôle pré-entraînés a été démontrée, par exemple, dans TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models de Minghao Li, Tengchao Lv, Lei Cui, Yijuan Lu, Dinei Florencio, Cha Zhang, Zhoujun Li et Furu Wei.

Une fois un VisionEncoderDecoderModel entraîné/ajusté, il peut être enregistré/chargé comme n'importe quel autre modèle (voir les exemples ci-dessous pour plus d'informations).

Un exemple d’application est la légende d’image, dans laquelle l’encodeur est utilisé pour encoder l’image, après quoi un modèle de langage autorégressif génère la légende. Un autre exemple est la reconnaissance optique de caractères. Reportez-vous à TrOCR, qui est une instance de VisionEncoderDecoderModel.

Initialisation aléatoire de VisionEncoderDecoderModel à partir des configurations de modèle

VisionEncoderDecoderModel peut être initialisé aléatoirement à partir d'une configuration d'encodeur et d'une configuration de décodeur. Dans l'exemple ci-dessous, nous montrons comment faire en utilisant la configuration par défaut ViTModel pour l'encodeur et la configuration par défaut BertForCausalLM pour le décodeur.

from transformers import BertConfig, VisionEncoderDecoderConfig, VisionEncoderDecoderModel, ViTConfig


config_encoder = ViTConfig()
config_decoder = BertConfig()

config = VisionEncoderDecoderConfig.from_encoder_decoder_configs(config_encoder, config_decoder)
model = VisionEncoderDecoderModel(config=config)

Initialisation de VisionEncoderDecoderModel à partir d'un encodeur pré-entraîné et d'un décodeur pré-entraîné

VisionEncoderDecoderModel peut être initialisé à partir d'un point de contrôle d'encodeur pré-entraîné et d'un point de contrôle de décodeur pré-entraîné. Notez que tout modèle de vision basé sur des Transformers pré-entraîné, par exemple Swin, peut servir d'encodeur, et que les modèles auto-encodants pré-entraînés, par exemple BERT, les modèles de langage causaux pré-entraînés, par exemple GPT2, ainsi que la partie décodeur pré-entraînée des modèles séquence-à-séquence, par exemple le décodeur de BART, peuvent être utilisés comme décodeur. Selon l'architecture choisie pour le décodeur, les couches d'attention croisée peuvent être initialisées aléatoirement. L'initialisation de VisionEncoderDecoderModel à partir de points de contrôle d'encodeur et de décodeur pré-entraînés nécessite que le modèle soit affiné sur une tâche en aval, comme l'a montré l'article de blog Warm-starting-encoder-decoder. Pour ce faire, la classe VisionEncoderDecoderModel fournit une méthode VisionEncoderDecoderModel.from_encoder_decoder_pretrained().

from transformers import VisionEncoderDecoderModel


model = VisionEncoderDecoderModel.from_encoder_decoder_pretrained(
    "microsoft/swin-base-patch4-window7-224-in22k", "google-bert/bert-base-uncased"
)

Charger un point de contrôle existant de VisionEncoderDecoderModel et effectuer une inférence

Pour charger des points de contrôle affinés de la classe VisionEncoderDecoderModel, VisionEncoderDecoderModel fournit la méthode from_pretrained(...), comme toute autre architecture de modèle dans Transformers.

Pour effectuer une inférence, on utilise la méthode generate, qui permet de générer du texte de manière autorégressive. Cette méthode prend en charge diverses formes de décodage, telles que le décodage glouton, la recherche par faisceau et l'échantillonnage multinomial.

import requests
from PIL import Image

from transformers import GPT2TokenizerFast, ViTImageProcessor, VisionEncoderDecoderModel

# load a fine-tuned image captioning model and corresponding tokenizer and image processor
model = VisionEncoderDecoderModel.from_pretrained("nlpconnect/vit-gpt2-image-captioning", device_map="auto")
tokenizer = GPT2TokenizerFast.from_pretrained("nlpconnect/vit-gpt2-image-captioning")
image_processor = ViTImageProcessor.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

# let's perform inference on an image
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
pixel_values = image_processor(image, return_tensors="pt").to(model.device).pixel_values

# autoregressively generate caption (uses greedy decoding by default)
generated_ids = model.generate(pixel_values)
generated_text = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(generated_text)
a cat laying on a blanket next to a cat laying on a bed

Entraînement

Une fois le modèle créé, il peut être affiné de manière similaire à BART, T5 ou tout autre modèle encodeur-décodeur sur un jeu de données de paires (image, texte). Comme vous pouvez le constater, le modèle n’a besoin que de 2 entrées pour calculer une perte : pixel_values (qui sont les images) et labels (qui sont les input_ids de la séquence cible encodée).

from datasets import load_dataset

from transformers import BertTokenizer, VisionEncoderDecoderModel, ViTImageProcessor


image_processor = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k")
tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisionEncoderDecoderModel.from_encoder_decoder_pretrained(
    "google/vit-base-patch16-224-in21k", "google-bert/bert-base-uncased"
)

model.config.decoder_start_token_id = tokenizer.cls_token_id
model.config.pad_token_id = tokenizer.pad_token_id

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]
pixel_values = image_processor(image, return_tensors="pt").to(model.device).pixel_values

labels = tokenizer(
    "an image of two cats chilling on a couch",
    return_tensors="pt",
).input_ids

# the forward function automatically creates the correct decoder_input_ids
loss = model(pixel_values=pixel_values, labels=labels).loss

Ce modèle a été contribué par nielsr.

VisionEncoderDecoderConfig

classe transformers.VisionEncoderDecoderConfig

< >

( 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 = 0id2label: 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 = Noneis_encoder_decoder: bool = Trueencoder: transformers.configuration_utils.PreTrainedConfig | dict | None = Nonedecoder: transformers.configuration_utils.PreTrainedConfig | dict | None = None )

Paramètres

  • is_encoder_decoder (bool, facultatif, valeur par défaut True) — Indique si le modèle est utilisé comme encodeur/décodeur ou non.
  • encoder (Union[~configuration_utils.PreTrainedConfig, dict], facultatif) — L’objet de configuration ou le dictionnaire du backbone de l’encodeur.
  • decoder (Union[~configuration_utils.PreTrainedConfig, dict], facultatif) — L’objet de configuration ou le dictionnaire du backbone du décodeur.

Il s'agit de la classe de configuration destinée à stocker la configuration d'un modèle Vision Encoder Decoder. Elle est utilisée pour instancier un modèle Vision Encoder Decoder en fonction des arguments spécifiés, en définissant l'architecture du modèle. L'instanciation d'une configuration avec les valeurs par défaut produira une configuration similaire à celle de None

Les objets de configuration héritent de PreTrainedConfig et peuvent être utilisés pour contrôler les sorties du modèle. Consultez la documentation de PreTrainedConfig pour plus d’informations.

Exemples :

>>> from transformers import BertConfig, ViTConfig, VisionEncoderDecoderConfig, VisionEncoderDecoderModel

>>> # Initializing a ViT & BERT style configuration
>>> config_encoder = ViTConfig()
>>> config_decoder = BertConfig()

>>> config = VisionEncoderDecoderConfig(encoder=config_encoder, decoder=config_decoder)

>>> # Initializing a ViTBert model (with random weights) from a ViT & google-bert/bert-base-uncased style configurations
>>> model = VisionEncoderDecoderModel(config=config)

>>> # Accessing the model configuration
>>> config_encoder = model.config.encoder
>>> config_decoder = model.config.decoder
>>> # set decoder config to causal lm
>>> config_decoder.is_decoder = True
>>> config_decoder.add_cross_attention = True

>>> # Saving the model, including its configuration
>>> model.save_pretrained("my-model")

>>> # loading model and config from pretrained folder
>>> encoder_decoder_config = VisionEncoderDecoderConfig.from_pretrained("my-model")
>>> model = VisionEncoderDecoderModel.from_pretrained("my-model", config=encoder_decoder_config)

from_encoder_decoder_configs

< >

( encoder_config: PreTrainedConfigdecoder_config: PreTrainedConfig**kwargs ) → VisionEncoderDecoderConfig

Une instance d'un objet de configuration

Instanciez un VisionEncoderDecoderConfig (ou une classe dérivée) à partir de la configuration d'un modèle encodeur pré-entraîné et de la configuration d'un modèle décodeur.

VisionEncoderDecoderModel

classe transformers.VisionEncoderDecoderModel

< >

( config: transformers.configuration_utils.PreTrainedConfig | None = Noneencoder: transformers.modeling_utils.PreTrainedModel | None = Nonedecoder: transformers.modeling_utils.PreTrainedModel | None = None )

Paramètres

  • config (PreTrainedConfig, facultatif) — Classe de configuration du modèle contenant tous les paramètres du modèle. L’initialisation à partir d’un fichier de configuration ne charge pas les poids associés au modèle, uniquement la configuration. Consultez la méthode from_pretrained() pour charger les poids du modèle.
  • encoder (PreTrainedModel, facultatif) — Le modèle encodeur à utiliser.
  • decoder (PreTrainedModel, facultatif) — Le modèle décodeur à utiliser.

Le modèle Vision Encoder Decoder brut, qui produit des états cachés bruts sans aucune tête spécifique au sommet.

Ce modèle hérite de PreTrainedModel. Consultez la documentation de la classe parente pour les méthodes génériques que la bibliothèque implémente pour tous ses modèles (tels que le téléchargement ou l'enregistrement, le redimensionnement des embeddings d'entrée, la taille des têtes, etc.)

Ce modèle est également une sous-classe de torch.nn.Module de PyTorch. Utilisez-le comme un module PyTorch standard et consultez la documentation de PyTorch pour tout ce qui concerne l'utilisation et le comportement généraux.

forward

< >

( pixel_values: typing.Optional[torch.Tensor] = Nonedecoder_input_ids: typing.Optional[torch.LongTensor] = Nonedecoder_attention_mask: typing.Optional[torch.BoolTensor] = Noneencoder_outputs: tuple[torch.Tensor] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = Nonedecoder_inputs_embeds: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → Seq2SeqLMOutput or tuple(torch.Tensor)

Paramètres

  • pixel_values (torch.Tensor de forme (batch_size, num_channels, image_size, image_size), facultatif) — Les tenseurs correspondant aux images d’entrée. Les valeurs de pixels peuvent être obtenues à l’aide de image_processor_class. Voir image_processor_class.__call__ pour plus de détails (processor_class utilise image_processor_class pour le traitement des images).
  • decoder_input_ids (torch.LongTensor de forme (batch_size, target_sequence_length), facultatif) — Indices des jetons de la séquence d'entrée du décodeur dans le vocabulaire. Les indices peuvent être obtenus à l'aide de PreTrainedTokenizer. Consultez PreTrainedTokenizer.encode() et PreTrainedTokenizer.call() pour plus de détails. Que sont les IDs d'entrée ? Si past_key_values est utilisé, il est facultatif de n'entrer que les derniers decoder_input_ids (voir past_key_values). Pour l'entraînement, decoder_input_ids est créé automatiquement par le modèle en décalant les labels vers la droite, en remplaçant -100 par pad_token_id et en les préfixant par decoder_start_token_id.

    Les indices peuvent être obtenus à l'aide de PreTrainedTokenizer. Consultez PreTrainedTokenizer.encode() et PreTrainedTokenizer.call() pour plus de détails.

    Qu'est-ce que les identifiants d'entrée ?

    Si past_key_values est utilisé, il est facultatif de n’entrer que les derniers decoder_input_ids (voir past_key_values).

    Pour l’entraînement, decoder_input_ids sont créés automatiquement par le modèle en décalant labels vers la droite, en remplaçant -100 par pad_token_id et en préfixant le tout avec decoder_start_token_id.

  • decoder_attention_mask (torch.BoolTensor de forme (batch_size, target_sequence_length), facultatif) — Comportement par défaut : générer un tenseur qui ignore les jetons de remplissage dans decoder_input_ids. Un masque causal sera également utilisé par défaut.
  • encoder_outputs (tuple[torch.Tensor], facultatif) — Le tuple est composé de (last_hidden_state, facultatif : hidden_states, facultatif : attentions) last_hidden_state de forme (batch_size, sequence_length, hidden_size), facultatif) est une séquence d’états cachés à la sortie de la dernière couche de l’encodeur. Utilisé dans l’attention croisée du décodeur.
  • past_key_values (~cache_utils.Cache, facultatif) — États cachés précalculés (clés et valeurs dans les blocs d'auto-attention et d'attention croisée) qui peuvent être utilisés pour accélérer le décodage séquentiel. Cela consiste généralement en la past_key_values retournée par le modèle à une étape antérieure du décodage, lorsque use_cache=True ou config.use_cache=True.

    Seule une instance de Cache est autorisée en entrée, consultez notre guide du cache kv. Si aucun past_key_values n'est transmis, DynamicCache sera initialisé par défaut.

    Le modèle produira le même format de cache qui est fourni en entrée.

    Si past_key_values sont utilisés, l’utilisateur doit fournir uniquement les input_ids non traités (ceux pour lesquels les états de clés et de valeurs passées n’ont pas été fournis à ce modèle) de forme (batch_size, unprocessed_length) au lieu de tous les input_ids de forme (batch_size, sequence_length).

  • decoder_inputs_embeds (torch.Tensor de forme (batch_size, target_sequence_length, hidden_size), facultatif) — Facultativement, au lieu de passer decoder_input_ids, vous pouvez choisir de passer directement une représentation intégrée. Cela est utile si vous souhaitez un meilleur contrôle sur la manière de convertir les indices de decoder_input_ids en vecteurs associés, par rapport à la matrice de recherche d’intégration interne du modèle.
  • labels (torch.LongTensor de forme (batch_size, sequence_length), facultatif) — Étiquettes pour le calcul de la perte de modélisation de langage masquée du décodeur. Les indices doivent être dans [-100, 0, ..., config.vocab_size] (voir la docstring de input_ids). Les jetons dont l'indice est défini sur -100 sont ignorés (masqués) ; la perte n'est calculée que pour les jetons dont l'étiquette est dans [0, ..., config.vocab_size]
  • use_cache (bool, facultatif) — Si défini sur True, les états clé-valeur past_key_values sont renvoyés et peuvent être utilisés pour accélérer le décodage (voir past_key_values).
  • output_attentions (bool, facultatif) — Indique s'il faut ou non retourner les tenseurs d'attention de toutes les couches d'attention. Consultez attentions sous les tenseurs retournés pour plus de détails.
  • output_hidden_states (bool, facultatif) — Indique s'il faut retourner les états cachés de toutes les couches. Voir hidden_states sous les tenseurs retournés pour plus de détails.
  • return_dict (bool, facultatif) — Indique s'il faut retourner un ModelOutput plutôt qu'un simple tuple.

Retourne

Seq2SeqLMOutput ou tuple(torch.Tensor)

Un Seq2SeqLMOutput ou un tuple de torch.Tensor (si return_dict=False est passé ou lorsque config.return_dict=False) comprenant divers éléments en fonction de la configuration (VisionEncoderDecoderConfig) et des entrées.

La méthode forward de VisionEncoderDecoderModel redéfinit la méthode spéciale __call__.

Bien que la recette de la passe avant doive être définie dans cette fonction, il faut ensuite appeler l'instance Module plutôt que celle-ci, car la première gère l'exécution des étapes de prétraitement et de post-traitement, tandis que la seconde les ignore silencieusement.

  • loss (torch.Tensor de forme (1,), facultatif, renvoyé lorsque labels est fourni) — Perte de modélisation du langage.

  • logits (torch.Tensor de forme (batch_size, sequence_length, config.vocab_size)) — Scores de prédiction de la tête de modélisation du langage (scores pour chaque jeton du vocabulaire avant SoftMax).

  • past_key_values (EncoderDecoderCache, facultatif, renvoyé lorsque use_cache=True est passé ou lorsque config.use_cache=True) — Il s’agit d’une instance de EncoderDecoderCache. Pour plus de détails, consultez notre guide sur le cache kv.

    Contient des états cachés précalculés (clés et valeurs dans les blocs d'auto-attention et dans les blocs d'attention croisée) qui peuvent être utilisés (voir l'entrée past_key_values) pour accélérer le décodage séquentiel.

  • decoder_hidden_states (tuple(torch.Tensor), facultatif, renvoyé lorsque output_hidden_states=True est passé ou lorsque config.output_hidden_states=True) — Tuple de torch.Tensor (un pour la sortie des embeddings, si le modèle possède une couche d’embedding, + un pour la sortie de chaque couche) de forme (batch_size, sequence_length, hidden_size).

    États cachés du décodeur à la sortie de chaque couche, plus les sorties de l'intégration initiale.

  • decoder_attentions (tuple(torch.Tensor), facultatif, renvoyé lorsque output_attentions=True est passé ou lorsque config.output_attentions=True) — Tuple de torch.Tensor (un par couche) de forme (batch_size, num_heads, sequence_length, sequence_length).

    Poids d'attention du décodeur, après le softmax d'attention, utilisés pour calculer la moyenne pondérée dans les têtes d'auto-attention.

  • cross_attentions (tuple(torch.Tensor), facultatif, renvoyé lorsque output_attentions=True est passé ou lorsque config.output_attentions=True) — Tuple de torch.Tensor (un par couche) de forme (batch_size, num_heads, sequence_length, sequence_length).

    Poids d'attention de la couche d'attention croisée du décodeur, après le softmax d'attention, utilisés pour calculer la moyenne pondérée dans les têtes d'attention croisée.

  • encoder_last_hidden_state (torch.Tensor de forme (batch_size, sequence_length, hidden_size), facultatif) — Séquence d'états cachés à la sortie de la dernière couche de l'encodeur du modèle.

  • encoder_hidden_states (tuple(torch.Tensor), facultatif, renvoyé lorsque output_hidden_states=True est passé ou lorsque config.output_hidden_states=True) — Tuple de torch.Tensor (un pour la sortie des embeddings, si le modèle possède une couche d’embedding, + un pour la sortie de chaque couche) de forme (batch_size, sequence_length, hidden_size).

    États cachés de l'encodeur à la sortie de chaque couche, plus les sorties des embeddings initiaux.

  • encoder_attentions (tuple(torch.Tensor), facultatif, renvoyé lorsque output_attentions=True est passé ou lorsque config.output_attentions=True) — Tuple de torch.Tensor (un par couche) de forme (batch_size, num_heads, sequence_length, sequence_length).

    Poids d'attention de l'encodeur, après le softmax d'attention, utilisés pour calculer la moyenne pondérée dans les têtes d'auto-attention.

Exemples :

>>> from transformers import AutoProcessor, VisionEncoderDecoderModel
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> from PIL import Image
>>> import torch

>>> processor = AutoProcessor.from_pretrained("microsoft/trocr-base-handwritten")
>>> model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten")

>>> # load image from the IAM dataset
>>> url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02.jpg"
>>> with httpx.stream("GET", url) as response:
...     image = Image.open(BytesIO(response.read())).convert("RGB")

>>> # training
>>> model.config.decoder_start_token_id = processor.tokenizer.eos_token_id
>>> model.config.pad_token_id = processor.tokenizer.pad_token_id
>>> model.config.vocab_size = model.config.decoder.vocab_size

>>> pixel_values = processor(image, return_tensors="pt").pixel_values
>>> text = "hello world"
>>> labels = processor.tokenizer(text, return_tensors="pt").input_ids
>>> outputs = model(pixel_values=pixel_values, labels=labels)
>>> loss = outputs.loss

>>> # inference (generation)
>>> generated_ids = model.generate(pixel_values)
>>> generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]

from_encoder_decoder_pretrained

< >

( encoder_pretrained_model_name_or_path: str | None = Nonedecoder_pretrained_model_name_or_path: str | None = None*model_args**kwargs )

Paramètres

  • encoder_pretrained_model_name_or_path (str, facultatif) — Informations nécessaires pour initialiser l'encodeur d'images. Peut être soit :
    • Une chaîne de caractères, l'identifiant du modèle d'un modèle pré-entraîné hébergé dans un dépôt de modèles sur huggingface.co. Un exemple est google/vit-base-patch16-224-in21k.
    • Un chemin vers un dossier contenant les poids du modèle enregistrés à l’aide de save_pretrained(), par exemple ./my_model_directory/.
  • decoder_pretrained_model_name_or_path (str, facultatif, valeur par défaut None) — Informations nécessaires pour initialiser le décodeur de texte. Peut être soit :
    • Une chaîne de caractères, l'identifiant du modèle d'un modèle pré-entraîné hébergé dans un dépôt de modèles sur huggingface.co.
    • Un chemin vers un dossier contenant les poids du modèle enregistrés à l’aide de save_pretrained(), par exemple ./my_model_directory/.
  • model_args (arguments positionnels restants, facultatif) — Tous les arguments positionnels restants seront transmis à la méthode __init__ du modèle sous-jacent.
  • kwargs (dictionnaire restant des arguments par mot-clé, facultatif) — Peut être utilisé pour mettre à jour l'objet de configuration (après son chargement) et initialiser le modèle (par ex., output_attentions=True).
    • Pour mettre à jour la configuration de l'encodeur, utilisez le préfixe encoder_ pour chaque paramètre de configuration.
    • Pour mettre à jour la configuration du décodeur, utilisez le préfixe decoder_ pour chaque paramètre de configuration.
    • Pour mettre à jour la configuration du modèle parent, n'utilisez pas de préfixe pour chaque paramètre de configuration.

    Le comportement diffère selon qu'une config est fournie ou chargée automatiquement.

Instanciez un encodeur et un décodeur à partir d’une ou deux classes de base de la bibliothèque, en utilisant des points de contrôle de modèles pré-entraînés.

Le modèle est défini par défaut en mode évaluation à l'aide de model.eval() (les modules Dropout sont désactivés). Pour entraîner le modèle, vous devez d'abord le remettre en mode d'entraînement avec model.train().

Exemple :

>>> from transformers import VisionEncoderDecoderModel

>>> # initialize a vit-bert from a pretrained ViT and a pretrained BERT model. Note that the cross-attention layers will be randomly initialized
>>> model = VisionEncoderDecoderModel.from_encoder_decoder_pretrained(
...     "google/vit-base-patch16-224-in21k", "google-bert/bert-base-uncased"
... )
>>> # saving model after fine-tuning
>>> model.save_pretrained("./vit-bert")
>>> # load fine-tuned model
>>> model = VisionEncoderDecoderModel.from_pretrained("./vit-bert")
Update on GitHub