Transformers 文件
VisualBERT
並獲得增強的文件體驗
開始使用
VisualBERT
概述
VisualBERT 模型由 Liunian Harold Li、Mark Yatskar、Da Yin、Cho-Jui Hsieh 和 Kai-Wei Chang 在 VisualBERT: A Simple and Performant Baseline for Vision and Language 中提出。VisualBERT 是一個在各種(影像,文字)對上訓練的神經網路。
論文摘要如下:
我們提出了 VisualBERT,一個簡單靈活的框架,用於建模廣泛的視覺-語言任務。VisualBERT 由一系列 Transformer 層組成,這些層透過自注意力隱式對齊輸入文字的元素和相關輸入影像中的區域。我們進一步提出了兩種基於視覺的語言模型目標,用於在影像字幕資料上預訓練 VisualBERT。在 VQA、VCR、NLVR2 和 Flickr30K 等四項視覺-語言任務上的實驗表明,VisualBERT 效能優於或媲美最先進的模型,同時顯著簡化。進一步的分析表明,VisualBERT 可以在沒有任何顯式監督的情況下將語言元素與影像區域關聯起來,甚至對句法關係也很敏感,例如,跟蹤動詞與其論元對應的影像區域之間的關聯。
此模型由 gchhablani 貢獻。原始程式碼可在此處找到。
使用提示
大多數提供的檢查點與 VisualBertForPreTraining 配置一起工作。其他提供的檢查點是用於下游任務(VQA('visualbert-vqa')、VCR('visualbert-vcr')、NLVR2('visualbert-nlvr2'))的微調檢查點。因此,如果您不從事這些下游任務,建議您使用預訓練檢查點。
對於 VCR 任務,作者使用一個微調的檢測器來生成視覺嵌入,適用於所有檢查點。我們不提供檢測器及其權重作為包的一部分,但它將在研究專案中提供,並且狀態可以直接載入到提供的檢測器中。
VisualBERT 是一個多模態視覺和語言模型。它可用於視覺問答、多項選擇、視覺推理和區域到短語對應任務。VisualBERT 使用類似 BERT 的 Transformer 為影像-文字對準備嵌入。文字和視覺特徵都被投影到一個相同維度的潛在空間中。
為了將影像輸入到模型中,每個影像都會透過一個預訓練的物件檢測器,並提取區域和邊界框。作者使用這些區域透過預訓練的 CNN(如 ResNet)後生成的特徵作為視覺嵌入。他們還添加了絕對位置嵌入,並將得到的向量序列輸入到標準的 BERT 模型中。文字輸入在嵌入層中連線到視覺嵌入的前面,並期望由 [CLS] 和 [SEP] 標記包圍,就像在 BERT 中一樣。段落 ID 也必須為文字和視覺部分適當地設定。
使用 BertTokenizer 對文字進行編碼。必須使用自定義的檢測器/影像處理器來獲取視覺嵌入。以下示例 Notebook 展示瞭如何將 VisualBERT 與類似 Detectron 的模型一起使用
VisualBERT VQA 演示 Notebook:此 Notebook 包含一個 VisualBERT VQA 的示例。
生成 VisualBERT 嵌入 (Colab Notebook):此 Notebook 包含一個如何生成視覺嵌入的示例。
以下示例展示瞭如何使用 VisualBertModel 獲取最後的隱藏狀態
>>> import torch
>>> from transformers import BertTokenizer, VisualBertModel
>>> model = VisualBertModel.from_pretrained("uclanlp/visualbert-vqa-coco-pre")
>>> tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-uncased")
>>> inputs = tokenizer("What is the man eating?", return_tensors="pt")
>>> # this is a custom function that returns the visual embeddings given the image path
>>> visual_embeds = get_visual_embeddings(image_path)
>>> visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
>>> visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
>>> inputs.update(
... {
... "visual_embeds": visual_embeds,
... "visual_token_type_ids": visual_token_type_ids,
... "visual_attention_mask": visual_attention_mask,
... }
... )
>>> outputs = model(**inputs)
>>> last_hidden_state = outputs.last_hidden_state
VisualBertConfig
class transformers.VisualBertConfig
< 源 >( vocab_size
= 30522 hidden_size
= 768 visual_embedding_dim
= 512 num_hidden_layers
= 12 num_attention_heads
= 12 intermediate_size
= 3072 hidden_act
= 'gelu' hidden_dropout_prob
= 0.1 attention_probs_dropout_prob
= 0.1 max_position_embeddings
= 512 type_vocab_size
= 2 initializer_range
= 0.02 layer_norm_eps
= 1e-12 bypass_transformer
= False special_visual_initialize
= True pad_token_id
= 1 bos_token_id
= 0 eos_token_id
= 2 **kwargs
)
引數
- vocab_size (
int
, 可選, 預設為 30522) — VisualBERT 模型的詞彙量大小。定義了呼叫 VisualBertModel 時傳遞的inputs_ids
可以表示的不同 token 的數量。模型的詞彙量大小。定義了傳遞給 VisualBertModel 前向方法的inputs_ids
可以表示的不同 token。 - hidden_size (
int
, 可選, 預設為 768) — 編碼器層和池化層維度。 - visual_embedding_dim (
int
, 可選, 預設為 512) — 將傳遞給模型的視覺嵌入的維度。 - num_hidden_layers (
int
, 可選, 預設為 12) — Transformer 編碼器中的隱藏層數量。 - num_attention_heads (
int
, 可選, 預設為 12) — Transformer 編碼器中每個注意力層的注意力頭數量。 - intermediate_size (
int
, 可選, 預設為 3072) — Transformer 編碼器中“中間”(即,前饋)層的維度。 - hidden_act (
str
或function
, 可選, 預設為"gelu"
) — 編碼器和池化器中的非線性啟用函式(函式或字串)。如果是字串,則支援"gelu"
、"relu"
、"selu"
和"gelu_new"
。 - hidden_dropout_prob (
float
, 可選, 預設為 0.1) — 嵌入、編碼器和池化器中所有全連線層的 dropout 機率。 - attention_probs_dropout_prob (
float
, 可選, 預設為 0.1) — 注意力機率的 dropout 比率。 - max_position_embeddings (
int
, 可選, 預設為 512) — 此模型可能使用的最大序列長度。通常設定為一個較大的值以備不時之需(例如,512、1024 或 2048)。 - type_vocab_size (
int
, 可選, 預設為 2) — 呼叫 VisualBertModel 時傳遞的token_type_ids
的詞彙量大小。 - initializer_range (
float
, 可選, 預設為 0.02) — 用於初始化所有權重矩陣的truncated_normal_initializer
的標準差。 - layer_norm_eps (
float
, 可選, 預設為 1e-12) — 層歸一化層使用的 epsilon 值。 - bypass_transformer (
bool
, 可選, 預設為False
) — 模型是否應繞過 Transformer 來處理視覺嵌入。如果設定為True
,模型將直接將VisualBertEmbeddings
中的視覺嵌入與 Transformer 的文字輸出連線起來,然後將其傳遞給一個自注意力層。 - special_visual_initialize (
bool
, 可選, 預設為True
) — 視覺 token 型別和位置型別嵌入權重是否應與文字 token 型別和位置型別嵌入權重初始化相同。如果設定為True
,文字 token 型別和位置型別嵌入的權重將被複制到相應的視覺嵌入層。
這是用於儲存 VisualBertModel 配置的配置類。它用於根據指定的引數例項化 VisualBERT 模型,定義模型架構。使用預設值例項化配置將產生與 VisualBERT uclanlp/visualbert-vqa-coco-pre 架構類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關更多資訊,請閱讀 PretrainedConfig 的文件。
示例
>>> from transformers import VisualBertConfig, VisualBertModel
>>> # Initializing a VisualBERT visualbert-vqa-coco-pre style configuration
>>> configuration = VisualBertConfig.from_pretrained("uclanlp/visualbert-vqa-coco-pre")
>>> # Initializing a model (with random weights) from the visualbert-vqa-coco-pre style configuration
>>> model = VisualBertModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
VisualBertModel
class transformers.VisualBertModel
< 源 >( config
add_pooling_layer
= True )
引數
- config (VisualBertModel) — 帶有模型所有引數的模型配置類。使用配置檔案初始化並不會載入模型相關權重,只會載入配置。檢視 from_pretrained() 方法以載入模型權重。
- add_pooling_layer (
bool
, 可選, 預設為True
) — 是否新增池化層。
該模型可以作為編碼器(僅包含自注意力機制)執行,其架構遵循 Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Lukasz Kaiser 和 Illia Polosukhin 在 Attention is all you need 中描述的結構。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< 源 >( input_ids
: typing.Optional[torch.LongTensor] = None attention_mask
: typing.Optional[torch.LongTensor] = None token_type_ids
: typing.Optional[torch.LongTensor] = None position_ids
: typing.Optional[torch.LongTensor] = None head_mask
: typing.Optional[torch.LongTensor] = None inputs_embeds
: typing.Optional[torch.FloatTensor] = None visual_embeds
: typing.Optional[torch.FloatTensor] = None visual_attention_mask
: typing.Optional[torch.LongTensor] = None visual_token_type_ids
: typing.Optional[torch.LongTensor] = None image_text_alignment
: typing.Optional[torch.LongTensor] = None output_attentions
: typing.Optional[bool] = None output_hidden_states
: typing.Optional[bool] = None return_dict
: typing.Optional[bool] = None ) → transformers.modeling_outputs.BaseModelOutputWithPooling 或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
, 形狀為(batch_size, sequence_length)
, 可選) — 詞彙表中輸入序列 token 的索引。預設情況下會忽略填充。索引可以使用 AutoTokenizer 獲取。有關詳細資訊,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.LongTensor
, 形狀為(batch_size, sequence_length)
, 可選) — 用於避免對填充 token 索引執行注意力的掩碼。掩碼值選擇範圍為[0, 1]
:- 1 表示 token 未被掩碼,
- 0 表示 token 已被掩碼。
- token_type_ids (
torch.LongTensor
, 形狀為(batch_size, sequence_length)
, 可選) — 段落 token 索引,用於指示輸入的第一個和第二個部分。索引選擇範圍為[0, 1]
:- 0 對應於 句子 A token,
- 1 對應於 句子 B token。
- position_ids (
torch.LongTensor
, 形狀為(batch_size, sequence_length)
, 可選) — 每個輸入序列 token 在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - head_mask (
torch.LongTensor
, 形狀為(num_heads,)
或(num_layers, num_heads)
, 可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇範圍為[0, 1]
:- 1 表示頭部未被掩碼,
- 0 表示頭部已被掩碼。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
,可選) — 可選地,你可以直接傳入嵌入表示,而不是傳入input_ids
。如果你想對如何將input_ids
索引轉換為相關向量有比模型內部嵌入查詢矩陣更多的控制,這會很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩碼的標記,
- 0 表示被掩碼的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於指示視覺嵌入不同部分的段標記索引。什麼是標記型別 ID? VisualBERT 的作者將 visual_token_type_ids 設定為所有標記的 1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多詳情請參閱返回張量下的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多詳情請參閱返回張量下的hidden_states
。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通元組。
返回
transformers.modeling_outputs.BaseModelOutputWithPooling 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.BaseModelOutputWithPooling 或一個 torch.FloatTensor
元組(如果傳入 return_dict=False
或 config.return_dict=False
時),包含根據配置 (VisualBertConfig) 和輸入的不同元素。
-
last_hidden_state (
torch.FloatTensor
, 形狀為(batch_size, sequence_length, hidden_size)
) — 模型最後一層輸出的隱藏狀態序列。 -
pooler_output (
torch.FloatTensor
,形狀為(batch_size, hidden_size)
) — 經過用於輔助預訓練任務的層處理後,序列中第一個標記(分類標記)的最後一層隱藏狀態。例如,對於 BERT 系列模型,這會返回分類標記在經過線性層和 tanh 啟用函式處理後的結果。線性層權重在預訓練期間根據下一句預測(分類)目標進行訓練。 -
hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(torch.FloatTensor)
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertModel 的 forward 方法,重寫了 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image.
from transformers import AutoTokenizer, VisualBertModel
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertModel.from_pretrained("uclanlp/visualbert-vqa-coco-pre")
inputs = tokenizer("The capital of France is Paris.", return_tensors="pt")
visual_embeds = get_visual_embeddings(image).unsqueeze(0)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
inputs.update(
{
"visual_embeds": visual_embeds,
"visual_token_type_ids": visual_token_type_ids,
"visual_attention_mask": visual_attention_mask,
}
)
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
VisualBertForPreTraining
class transformers.VisualBertForPreTraining
< source >( config )
引數
- config (VisualBertForPreTraining) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。要載入模型權重,請檢視 from_pretrained() 方法。
VisualBert 模型,頂部帶有兩個頭,如預訓練期間所做:一個 masked language modeling
(掩碼語言建模)頭和一個 sentence-image prediction (classification)
(句子-影像預測(分類))頭。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.LongTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None visual_embeds: typing.Optional[torch.FloatTensor] = None visual_attention_mask: typing.Optional[torch.LongTensor] = None visual_token_type_ids: typing.Optional[torch.LongTensor] = None image_text_alignment: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None sentence_image_labels: typing.Optional[torch.LongTensor] = None ) → transformers.models.visual_bert.modeling_visual_bert.VisualBertForPreTrainingOutput
或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 詞彙表中輸入序列標記的索引。預設情況下會忽略填充。可以使用 AutoTokenizer 獲取索引。有關詳情,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於避免對填充標記索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩碼的標記,
- 0 表示被掩碼的標記。
- token_type_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於指示輸入的第一部分和第二部分的段標記索引。索引選擇在[0, 1]
之間:- 0 對應於句子 A 標記,
- 1 對應於句子 B 標記。
- position_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 輸入序列中每個標記在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - head_mask (
torch.LongTensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示頭部未被掩碼,
- 0 表示頭部被掩碼。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
,可選) — 可選地,你可以直接傳入嵌入表示,而不是傳入input_ids
。如果你想對如何將input_ids
索引轉換為相關向量有比模型內部嵌入查詢矩陣更多的控制,這會很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩碼的標記,
- 0 表示被掩碼的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於指示視覺嵌入不同部分的段標記索引。什麼是標記型別 ID? VisualBERT 的作者將 visual_token_type_ids 設定為所有標記的 1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多詳情請參閱返回張量下的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多詳情請參閱返回張量下的hidden_states
。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通元組。 - labels (
torch.LongTensor
,形狀為(batch_size, total_sequence_length)
,可選) — 用於計算掩碼語言建模損失的標籤。索引應在[-100, 0, ..., config.vocab_size]
之間(參見input_ids
文件字串)。索引設定為-100
的標記將被忽略(掩碼),損失只對標籤在[0, ..., config.vocab_size]
之間的標記計算。 - sentence_image_labels (
torch.LongTensor
,形狀為(batch_size,)
,可選) — 用於計算句子-影像預測(分類)損失的標籤。輸入應該是一個序列對(參見input_ids
文件字串)。索引應在[0, 1]
之間:- 0 表示序列 B 與給定影像的序列 A 是匹配對,
- 1 表示序列 B 是相對於給定影像的隨機序列。
返回
transformers.models.visual_bert.modeling_visual_bert.VisualBertForPreTrainingOutput
或 tuple(torch.FloatTensor)
一個 transformers.models.visual_bert.modeling_visual_bert.VisualBertForPreTrainingOutput
或一個 torch.FloatTensor
元組(如果傳入 return_dict=False
或 config.return_dict=False
時),包含根據配置 (VisualBertConfig) 和輸入的不同元素。
-
loss (
*可選*
, 當提供labels
時返回,torch.FloatTensor
,形狀為(1,)
) — 總損失,是掩碼語言建模損失和句子-影像預測(分類)損失的總和。 -
prediction_logits (
torch.FloatTensor
形狀為(batch_size, sequence_length, config.vocab_size)
) — 語言建模頭的預測分數(SoftMax 之前的每個詞彙 token 的分數)。 -
seq_relationship_logits (
torch.FloatTensor
,形狀為(batch_size, 2)
) — 句子-影像預測(分類)頭的預測分數(SoftMax 之前的 True/False 延續分數)。 -
hidden_states (
tuple[torch.FloatTensor]
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple[torch.FloatTensor]
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertForPreTraining 的 forward 方法,重寫了 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image in the batch.
from transformers import AutoTokenizer, VisualBertForPreTraining
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertForPreTraining.from_pretrained("uclanlp/visualbert-vqa-coco-pre")
inputs = tokenizer("The capital of France is [MASK].", return_tensors="pt")
visual_embeds = get_visual_embeddings(image).unsqueeze(0)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
inputs.update(
{
"visual_embeds": visual_embeds,
"visual_token_type_ids": visual_token_type_ids,
"visual_attention_mask": visual_attention_mask,
}
)
max_length = inputs["input_ids"].shape[-1] + visual_embeds.shape[-2]
labels = tokenizer(
"The capital of France is Paris.", return_tensors="pt", padding="max_length", max_length=max_length
)["input_ids"]
sentence_image_labels = torch.tensor(1).unsqueeze(0) # Batch_size
outputs = model(**inputs, labels=labels, sentence_image_labels=sentence_image_labels)
loss = outputs.loss
prediction_logits = outputs.prediction_logits
seq_relationship_logits = outputs.seq_relationship_logits
VisualBertForQuestionAnswering
class transformers.VisualBertForQuestionAnswering
< source >( config )
引數
- config (VisualBertForQuestionAnswering) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。要載入模型權重,請檢視 from_pretrained() 方法。
VisualBert 模型,頂部帶有分類/迴歸頭(在池化輸出頂部是一個 dropout 和一個線性層),用於 VQA。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.LongTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None visual_embeds: typing.Optional[torch.FloatTensor] = None visual_attention_mask: typing.Optional[torch.LongTensor] = None visual_token_type_ids: typing.Optional[torch.LongTensor] = None image_text_alignment: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None ) → transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 詞彙表中輸入序列標記的索引。預設情況下會忽略填充。可以使用 AutoTokenizer 獲取索引。有關詳情,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於避免對填充標記索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩碼的標記,
- 0 表示被掩碼的標記。
- token_type_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於指示輸入的第一部分和第二部分的段標記索引。索引選擇在[0, 1]
之間:- 0 對應於句子 A 標記,
- 1 對應於句子 B 標記。
- position_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 輸入序列中每個標記在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - head_mask (
torch.LongTensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示頭部未被掩碼,
- 0 表示頭部被掩碼。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
,可選) — 可選地,你可以直接傳入嵌入表示,而不是傳入input_ids
。如果你想對如何將input_ids
索引轉換為相關向量有比模型內部嵌入查詢矩陣更多的控制,這會很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩碼的標記,
- 0 表示被掩碼的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於指示視覺嵌入不同部分的段標記索引。什麼是標記型別 ID? VisualBERT 的作者將 visual_token_type_ids 設定為所有標記的 1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多詳情請參閱返回張量下的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多詳情請參閱返回張量下的hidden_states
。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通元組。 - labels (
torch.LongTensor
,形狀為(batch_size, total_sequence_length)
,可選) — 用於計算序列分類/迴歸損失的標籤。索引應在[0, ..., config.num_labels - 1]
之間。標籤和返回的 logits 之間計算 KLDivLoss。
返回
transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.SequenceClassifierOutput 或一個 torch.FloatTensor
的元組 (如果傳入 return_dict=False
或 config.return_dict=False
) ,其中包含各種元素,具體取決於配置 (VisualBertConfig) 和輸入。
-
loss (形狀為
(1,)
的torch.FloatTensor
,可選,當提供labels
時返回) — 分類損失(如果 config.num_labels==1,則為迴歸損失)。 -
logits (形狀為
(batch_size, config.num_labels)
的torch.FloatTensor
) — 分類(如果 config.num_labels==1,則為迴歸)分數(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(torch.FloatTensor)
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertForQuestionAnswering 的前向方法,它覆蓋了 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image in the batch.
from transformers import AutoTokenizer, VisualBertForQuestionAnswering
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertForQuestionAnswering.from_pretrained("uclanlp/visualbert-vqa")
text = "Who is eating the apple?"
inputs = tokenizer(text, return_tensors="pt")
visual_embeds = get_visual_embeddings(image).unsqueeze(0)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
inputs.update(
{
"visual_embeds": visual_embeds,
"visual_token_type_ids": visual_token_type_ids,
"visual_attention_mask": visual_attention_mask,
}
)
labels = torch.tensor([[0.0, 1.0]]).unsqueeze(0) # Batch size 1, Num labels 2
outputs = model(**inputs, labels=labels)
loss = outputs.loss
scores = outputs.logits
VisualBertForMultipleChoice
class transformers.VisualBertForMultipleChoice
< source >( config )
引數
- config (VisualBertForMultipleChoice) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。請檢視 from_pretrained() 方法來載入模型權重。
Visual Bert 模型,頂部帶有多項選擇分類頭(池化輸出頂部的線性層和 softmax),例如用於 RocStories/SWAG 任務。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.LongTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None visual_embeds: typing.Optional[torch.FloatTensor] = None visual_attention_mask: typing.Optional[torch.LongTensor] = None visual_token_type_ids: typing.Optional[torch.LongTensor] = None image_text_alignment: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None ) → transformers.modeling_outputs.MultipleChoiceModelOutput 或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
,形狀為(batch_size, num_choices, sequence_length)
) — 詞彙表中輸入序列標記的索引。索引可以使用 AutoTokenizer 獲取。詳情請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.__call__()。
- attention_mask (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於避免對填充標記索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- token_type_ids (
torch.LongTensor
,形狀為(batch_size, num_choices, sequence_length)
,可選) — 段標記索引,用於指示輸入的第一個和第二個部分。索引選擇在[0, 1]
之間:- 0 對應於一個句子 A 標記,
- 1 對應於一個句子 B 標記。
- position_ids (
torch.LongTensor
,形狀為(batch_size, num_choices, sequence_length)
,可選) — 每個輸入序列標記在位置嵌入中的位置索引。選擇範圍為[0, config.max_position_embeddings - 1]
。 - head_mask (
torch.LongTensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示頭部未被掩蓋,
- 0 表示頭部被掩蓋。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, num_choices, sequence_length, hidden_size)
,可選) — 可選地,您可以選擇直接傳遞嵌入表示,而不是傳遞input_ids
。如果您希望對如何將input_ids
索引轉換為關聯向量擁有比模型內部嵌入查詢矩陣更多的控制權,這將很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 段標記索引,用於指示視覺嵌入的不同部分。什麼是標記型別 ID? VisualBERT 的作者將visual_token_type_ids 設定為所有標記的1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
,可選) — 是否返回所有注意力層的注意力張量。更多詳情請參見返回張量中的attentions
。 - output_hidden_states (
bool
,可選) — 是否返回所有層的隱藏狀態。更多詳情請參見返回張量中的hidden_states
。 - return_dict (
bool
,可選) — 是否返回 ModelOutput 而不是普通的元組。 - labels (
torch.LongTensor
,形狀為(batch_size,)
,可選) — 用於計算多項選擇分類損失的標籤。索引應在[0, ..., num_choices-1]
之間,其中num_choices
是輸入張量第二個維度的大小。(請參見上面的input_ids
)
返回
transformers.modeling_outputs.MultipleChoiceModelOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.MultipleChoiceModelOutput 或一個 torch.FloatTensor
的元組 (如果傳入 return_dict=False
或 config.return_dict=False
) ,其中包含各種元素,具體取決於配置 (VisualBertConfig) 和輸入。
-
loss (形狀為 (1,) 的
torch.FloatTensor
,可選,當提供labels
時返回) — 分類損失。 -
logits (形狀為
(batch_size, num_choices)
的torch.FloatTensor
) — num_choices 是輸入張量的第二維大小。(請參閱上面的 input_ids)。分類分數(SoftMax 之前)。
-
hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(torch.FloatTensor)
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertForMultipleChoice 的前向方法,它覆蓋了 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image in the batch.
from transformers import AutoTokenizer, VisualBertForMultipleChoice
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertForMultipleChoice.from_pretrained("uclanlp/visualbert-vcr")
prompt = "In Italy, pizza served in formal settings, such as at a restaurant, is presented unsliced."
choice0 = "It is eaten with a fork and a knife."
choice1 = "It is eaten while held in the hand."
visual_embeds = get_visual_embeddings(image)
# (batch_size, num_choices, visual_seq_length, visual_embedding_dim)
visual_embeds = visual_embeds.expand(1, 2, *visual_embeds.shape)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
labels = torch.tensor(0).unsqueeze(0) # choice0 is correct (according to Wikipedia ;)), batch size 1
encoding = tokenizer([[prompt, prompt], [choice0, choice1]], return_tensors="pt", padding=True)
# batch size is 1
inputs_dict = {k: v.unsqueeze(0) for k, v in encoding.items()}
inputs_dict.update(
{
"visual_embeds": visual_embeds,
"visual_attention_mask": visual_attention_mask,
"visual_token_type_ids": visual_token_type_ids,
"labels": labels,
}
)
outputs = model(**inputs_dict)
loss = outputs.loss
logits = outputs.logits
VisualBertForVisualReasoning
class transformers.VisualBertForVisualReasoning
< source >( config )
引數
- config (VisualBertForVisualReasoning) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。請檢視 from_pretrained() 方法來載入模型權重。
VisualBert 模型,頂部帶有用於視覺推理的序列分類頭(池化輸出頂部的 dropout 和線性層),例如用於 NLVR 任務。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.LongTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None visual_embeds: typing.Optional[torch.FloatTensor] = None visual_attention_mask: typing.Optional[torch.LongTensor] = None visual_token_type_ids: typing.Optional[torch.LongTensor] = None image_text_alignment: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None ) → transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 詞彙表中輸入序列標記的索引。預設情況下將忽略填充。索引可以使用 AutoTokenizer 獲取。詳情請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.__call__()。
- attention_mask (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於避免對填充標記索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- token_type_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 段標記索引,用於指示輸入的第一個和第二個部分。索引選擇在[0, 1]
之間:- 0 對應於一個句子 A 標記,
- 1 對應於一個句子 B 標記。
- position_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 每個輸入序列標記在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - head_mask (
torch.LongTensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示頭部未被掩蓋,
- 0 表示頭部被掩蓋。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
,可選) — 可選地,您可以選擇直接傳遞嵌入表示,而不是傳遞input_ids
。如果您希望對如何將input_ids
索引轉換為關聯向量擁有比模型內部嵌入查詢矩陣更多的控制權,這將很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 段標記索引,用於指示視覺嵌入的不同部分。什麼是標記型別 ID? VisualBERT 的作者將visual_token_type_ids 設定為所有標記的1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
,可選) — 是否返回所有注意力層的注意力張量。更多詳情請參見返回張量中的attentions
。 - output_hidden_states (
bool
,可選) — 是否返回所有層的隱藏狀態。更多詳情請參見返回張量中的hidden_states
。 - return_dict (
bool
,可選) — 是否返回 ModelOutput 而不是普通的元組。 - labels (
torch.LongTensor
,形狀為(batch_size,)
,可選) — 用於計算序列分類/迴歸損失的標籤。索引應在[0, ..., config.num_labels - 1]
之間。針對這些標籤計算分類損失(交叉熵)。
返回
transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.SequenceClassifierOutput 或一個 torch.FloatTensor
的元組 (如果傳入 return_dict=False
或 config.return_dict=False
) ,其中包含各種元素,具體取決於配置 (VisualBertConfig) 和輸入。
-
loss (形狀為
(1,)
的torch.FloatTensor
,可選,當提供labels
時返回) — 分類損失(如果 config.num_labels==1,則為迴歸損失)。 -
logits (形狀為
(batch_size, config.num_labels)
的torch.FloatTensor
) — 分類(如果 config.num_labels==1,則為迴歸)分數(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(torch.FloatTensor)
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertForVisualReasoning 的前向方法,它覆蓋了 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image in the batch.
from transformers import AutoTokenizer, VisualBertForVisualReasoning
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertForVisualReasoning.from_pretrained("uclanlp/visualbert-nlvr2")
text = "Who is eating the apple?"
inputs = tokenizer(text, return_tensors="pt")
visual_embeds = get_visual_embeddings(image).unsqueeze(0)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
inputs.update(
{
"visual_embeds": visual_embeds,
"visual_token_type_ids": visual_token_type_ids,
"visual_attention_mask": visual_attention_mask,
}
)
labels = torch.tensor(1).unsqueeze(0) # Batch size 1, Num choices 2
outputs = model(**inputs, labels=labels)
loss = outputs.loss
scores = outputs.logits
VisualBertForRegionToPhraseAlignment
class transformers.VisualBertForRegionToPhraseAlignment
< source >( config )
引數
- config (VisualBertForRegionToPhraseAlignment) — 模型的配置類,包含模型的所有引數。使用配置檔案初始化並不會載入與模型相關的權重,只加載配置。請檢視 from_pretrained() 方法來載入模型權重。
VisualBert 模型,頂部帶有掩碼語言建模頭和注意力層,用於區域到短語對齊,例如 Flickr30 Entities 任務。
此模型繼承自 PreTrainedModel。有關庫為其所有模型實現的通用方法(如下載或儲存、調整輸入嵌入大小、修剪頭部等)的更多資訊,請檢視父類文件。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參閱 PyTorch 文件以獲取所有與一般使用和行為相關的事項。
前向傳播
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.LongTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None visual_embeds: typing.Optional[torch.FloatTensor] = None visual_attention_mask: typing.Optional[torch.LongTensor] = None visual_token_type_ids: typing.Optional[torch.LongTensor] = None image_text_alignment: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None region_to_phrase_position: typing.Optional[torch.LongTensor] = None labels: typing.Optional[torch.LongTensor] = None ) → transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
引數
- input_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 詞彙表中輸入序列標記的索引。預設情況下將忽略填充。索引可以使用 AutoTokenizer 獲取。詳情請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.__call__()。
- attention_mask (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 用於避免對填充標記索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- token_type_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 段標記索引,用於指示輸入的第一個和第二個部分。索引選擇在[0, 1]
之間:- 0 對應於一個句子 A 標記,
- 1 對應於一個句子 B 標記。
- position_ids (
torch.LongTensor
,形狀為(batch_size, sequence_length)
,可選) — 每個輸入序列標記在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - head_mask (
torch.LongTensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭部無效的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示頭部未被掩蓋,
- 0 表示頭部被掩蓋。
- inputs_embeds (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
,可選) — 可選地,您可以選擇直接傳遞嵌入表示,而不是傳遞input_ids
。如果您希望對如何將input_ids
索引轉換為關聯向量擁有比模型內部嵌入查詢矩陣更多的控制權,這將很有用。 - visual_embeds (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length, visual_embedding_dim)
,可選) — 視覺輸入的嵌入表示,通常使用物件檢測器獲得。 - visual_attention_mask (
torch.FloatTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 用於避免對視覺嵌入執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示未被掩蓋的標記,
- 0 表示被掩蓋的標記。
- visual_token_type_ids (
torch.LongTensor
,形狀為(batch_size, visual_seq_length)
,可選) — 段標記索引,用於指示視覺嵌入的不同部分。什麼是標記型別 ID? VisualBERT 的作者將visual_token_type_ids 設定為所有標記的1。
- image_text_alignment (
torch.LongTensor
,形狀為(batch_size, visual_seq_length, alignment_number)
,可選) — 影像-文字對齊用於決定視覺嵌入的位置 ID。 - output_attentions (
bool
,可選) — 是否返回所有注意力層的注意力張量。更多詳情請參見返回張量中的attentions
。 - output_hidden_states (
bool
, optional) — 是否返回所有層的隱藏狀態。更多詳細資訊請參閱返回張量中的hidden_states
。 - return_dict (
bool
, optional) — 是否返回 ModelOutput 而不是普通元組。 - region_to_phrase_position (
torch.LongTensor
形狀為(batch_size, total_sequence_length)
, 可選) — 描述影像嵌入與文字標記對應位置的位置資訊。 - labels (
torch.LongTensor
形狀為(batch_size, total_sequence_length, visual_sequence_length)
, 可選) — 用於計算掩碼語言建模損失的標籤。KLDivLoss 是針對這些標籤和注意力層的輸出計算的。
返回
transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.SequenceClassifierOutput 或一個 torch.FloatTensor
的元組 (如果傳入 return_dict=False
或 config.return_dict=False
) ,其中包含各種元素,具體取決於配置 (VisualBertConfig) 和輸入。
-
loss (形狀為
(1,)
的torch.FloatTensor
,可選,當提供labels
時返回) — 分類損失(如果 config.num_labels==1,則為迴歸損失)。 -
logits (形狀為
(batch_size, config.num_labels)
的torch.FloatTensor
) — 分類(如果 config.num_labels==1,則為迴歸)分數(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳入output_hidden_states=True
或config.output_hidden_states=True
時返回) —torch.FloatTensor
元組(一個用於嵌入層的輸出,如果模型有嵌入層,再加上每個層的輸出),形狀為(batch_size, sequence_length, hidden_size)
。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple(torch.FloatTensor)
, 可選, 當傳入output_attentions=True
或config.output_attentions=True
時返回) —torch.FloatTensor
元組(每個層一個),形狀為(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
VisualBertForRegionToPhraseAlignment
的 forward 方法會覆蓋 __call__
特殊方法。
儘管 forward pass 的配方需要在該函式中定義,但之後應該呼叫 Module
例項,而不是該函式本身,因為前者負責執行預處理和後處理步驟,而後者會默默忽略它們。
示例
# Assumption: *get_visual_embeddings(image)* gets the visual embeddings of the image in the batch.
from transformers import AutoTokenizer, VisualBertForRegionToPhraseAlignment
import torch
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = VisualBertForRegionToPhraseAlignment.from_pretrained("uclanlp/visualbert-vqa-coco-pre")
text = "Who is eating the apple?"
inputs = tokenizer(text, return_tensors="pt")
visual_embeds = get_visual_embeddings(image).unsqueeze(0)
visual_token_type_ids = torch.ones(visual_embeds.shape[:-1], dtype=torch.long)
visual_attention_mask = torch.ones(visual_embeds.shape[:-1], dtype=torch.float)
region_to_phrase_position = torch.ones((1, inputs["input_ids"].shape[-1] + visual_embeds.shape[-2]))
inputs.update(
{
"region_to_phrase_position": region_to_phrase_position,
"visual_embeds": visual_embeds,
"visual_token_type_ids": visual_token_type_ids,
"visual_attention_mask": visual_attention_mask,
}
)
labels = torch.ones(
(1, inputs["input_ids"].shape[-1] + visual_embeds.shape[-2], visual_embeds.shape[-2])
) # Batch size 1
outputs = model(**inputs, labels=labels)
loss = outputs.loss
scores = outputs.logits