Transformers 文件
ViTMSN
並獲得增強的文件體驗
開始使用
ViTMSN
概述
ViTMSN 模型由 Mahmoud Assran、Mathilde Caron、Ishan Misra、Piotr Bojanowski、Florian Bordes、Pascal Vincent、Armand Joulin、Michael Rabbat、Nicolas Ballas 在論文 《用於標籤高效學習的掩碼孿生網路》(Masked Siamese Networks for Label-Efficient Learning) 中提出。該論文提出了一種聯合嵌入架構,用於匹配掩碼影像塊的原型與未掩碼影像塊的原型。透過這種設定,他們的方法在少樣本和極少樣本場景下均取得了優異的效能。
論文摘要如下:
我們提出了掩碼孿生網路(Masked Siamese Networks, MSN),一個用於學習影像表示的自監督學習框架。我們的方法將包含隨機掩碼影像塊的影像檢視的表示與原始未掩碼影像的表示進行匹配。這種自監督預訓練策略在應用於 Vision Transformer 時具有特別好的可擴充套件性,因為網路僅處理未掩碼的影像塊。因此,MSN 提高了聯合嵌入架構的可擴充套件性,同時生成了具有高語義級別的表示,在少樣本影像分類任務中表現出競爭力。例如,在 ImageNet-1K 資料集上,僅使用 5,000 張帶註釋的影像,我們的基礎 MSN 模型就達到了 72.4% 的 top-1 準確率;使用 1% 的 ImageNet-1K 標籤,我們達到了 75.7% 的 top-1 準確率,為該基準上的自監督學習設定了新的 SOTA 標準。

該模型由 sayakpaul 貢獻。原始程式碼可以在這裡找到。
使用技巧
- MSN(掩碼孿生網路)是一種用於 Vision Transformers (ViTs) 自監督預訓練的方法。預訓練的目標是使未掩碼影像檢視分配的原型與相同影像的掩碼檢視分配的原型相匹配。
- 作者僅釋出了主幹網路(在 ImageNet-1k 上預訓練)的預訓練權重。因此,要將其用於你自己的影像分類資料集,請使用從 ViTMSNModel 初始化的 ViTMSNForImageClassification 類。有關微調的詳細教程,請參考此 notebook。
- MSN 在少樣本和極少樣本場景中尤其有用。值得注意的是,在微調時,僅使用 1% 的 ImageNet-1K 標籤,它就達到了 75.7% 的 top-1 準確率。
使用縮放點積注意力(SDPA)
PyTorch 包含一個原生的縮放點積注意力(SDPA)運算元,作為 torch.nn.functional
的一部分。該函式包含了多種實現,可以根據輸入和使用的硬體來應用。更多資訊請參閱官方文件或GPU 推理頁面。
當實現可用時,SDPA 預設用於 `torch>=2.1.1`,但你也可以在 `from_pretrained()` 中設定 `attn_implementation="sdpa"` 來明確請求使用 SDPA。
from transformers import ViTMSNForImageClassification
model = ViTMSNForImageClassification.from_pretrained("facebook/vit-msn-base", attn_implementation="sdpa", torch_dtype=torch.float16)
...
為了獲得最佳加速效果,我們建議以半精度(例如 `torch.float16` 或 `torch.bfloat16`)載入模型。
在本地基準測試(A100-40GB, PyTorch 2.3.0, OS Ubuntu 22.04)中,使用 float32
和 facebook/vit-msn-base
模型,我們在推理過程中觀察到以下速度提升。
批次大小 | 平均推理時間(毫秒),eager 模式 | 平均推理時間(毫秒),sdpa 模型 | 加速,Sdpa / Eager (x) |
---|---|---|---|
1 | 7 | 6 | 1.17 |
2 | 8 | 6 | 1.33 |
4 | 8 | 6 | 1.33 |
8 | 8 | 6 | 1.33 |
資源
一份官方 Hugging Face 和社群(由 🌎 標誌表示)資源的列表,幫助你開始使用 ViT MSN。
如果您有興趣在此處提交資源,請隨時開啟 Pull Request,我們將對其進行審查!該資源最好能展示一些新內容,而不是重複現有資源。
ViTMSNConfig
class transformers.ViTMSNConfig
< 源 >( hidden_size = 768 num_hidden_layers = 12 num_attention_heads = 12 intermediate_size = 3072 hidden_act = 'gelu' hidden_dropout_prob = 0.0 attention_probs_dropout_prob = 0.0 initializer_range = 0.02 layer_norm_eps = 1e-06 image_size = 224 patch_size = 16 num_channels = 3 qkv_bias = True **kwargs )
引數
- hidden_size (
int
, 可選, 預設為 768) — 編碼器層和池化層的維度。 - 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.0) — 嵌入層、編碼器和池化層中所有全連線層的丟棄機率。 - attention_probs_dropout_prob (
float
, 可選, 預設為 0.0) — 注意力機率的丟棄率。 - initializer_range (
float
, 可選, 預設為 0.02) — 用於初始化所有權重矩陣的 truncated_normal_initializer 的標準差。 - layer_norm_eps (
float
, 可選, 預設為 1e-06) — 層歸一化層使用的 epsilon 值。 - image_size (
int
, 可選, 預設為 224) — 每張影像的大小(解析度)。 - patch_size (
int
, 可選, 預設為 16) — 每個影像塊的大小(解析度)。 - num_channels (
int
, 可選, 預設為 3) — 輸入通道的數量。 - qkv_bias (
bool
, 可選, 預設為True
) — 是否為 queries、keys 和 values 新增偏置。
這是用於儲存 ViTMSNModel 配置的配置類。它用於根據指定的引數例項化一個 ViT MSN 模型,並定義模型架構。使用預設值例項化配置將產生與 ViT facebook/vit_msn_base 架構類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。更多資訊請參閱 PretrainedConfig 的文件。
示例
>>> from transformers import ViTMSNModel, ViTMSNConfig
>>> # Initializing a ViT MSN vit-msn-base style configuration
>>> configuration = ViTConfig()
>>> # Initializing a model from the vit-msn-base style configuration
>>> model = ViTMSNModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
ViTMSNModel
class transformers.ViTMSNModel
< 源 >( config: ViTMSNConfig use_mask_token: bool = False )
引數
- config (ViTMSNConfig) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型關聯的權重,只會載入配置。要載入模型權重,請檢視 from_pretrained() 方法。
- use_mask_token (
bool
, 可選, 預設為False
) — 是否在掩碼影像建模中使用掩碼標記。
基礎的 Vit Msn 模型,輸出原始的隱藏狀態,頂部沒有任何特定的頭部。
該模型繼承自 PreTrainedModel。請檢視超類文件以瞭解該庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
該模型也是一個 PyTorch torch.nn.Module 子類。可以像常規 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< 源 >( pixel_values: typing.Optional[torch.Tensor] = None bool_masked_pos: typing.Optional[torch.BoolTensor] = None head_mask: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None interpolate_pos_encoding: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
引數
- pixel_values (
torch.Tensor
,形狀為(batch_size, num_channels, image_size, image_size)
, 可選) — 與輸入影像對應的張量。畫素值可以使用{image_processor_class}
獲得。詳情請參閱{image_processor_class}.__call__
({processor_class}
使用{image_processor_class}
處理影像)。 - bool_masked_pos (
torch.BoolTensor
,形狀為(batch_size, num_patches)
, 可選) — 布林型別的掩碼位置。指示哪些影像塊被掩碼 (1),哪些沒有 (0)。 - head_mask (
torch.Tensor
,形狀為(num_heads,)
或(num_layers, num_heads)
, 可選) — 用於將自注意力模組中選定的頭置零的掩碼。掩碼值在[0, 1]
範圍內選擇:- 1 表示該頭未被掩碼,
- 0 表示該頭已被掩碼。
- output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多細節請參閱返回張量下的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多細節請參閱返回張量下的hidden_states
。 - interpolate_pos_encoding (
bool
, 可選) — 是否對預訓練的位置編碼進行插值。 - return_dict (
bool
, 可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
返回
transformers.modeling_outputs.BaseModelOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.BaseModelOutput 或一個 torch.FloatTensor
的元組 (如果傳遞了 return_dict=False
或 config.return_dict=False
),包含根據配置 (ViTMSNConfig) 和輸入而定的各種元素。
-
last_hidden_state (
torch.FloatTensor
, 形狀為(batch_size, sequence_length, hidden_size)
) — 模型最後一層輸出的隱藏狀態序列。 -
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 後的注意力權重,用於計算自注意力頭中的加權平均值。
ViTMSNModel 的 forward 方法重寫了 __call__
特殊方法。
雖然前向傳播的流程需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理預處理和後處理步驟,而後者會默默地忽略它們。
示例
>>> from transformers import AutoImageProcessor, ViTMSNModel
>>> import torch
>>> from PIL import Image
>>> import requests
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/vit-msn-small")
>>> model = ViTMSNModel.from_pretrained("facebook/vit-msn-small")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_state
ViTMSNForImageClassification
class transformers.ViTMSNForImageClassification
< 源 >( config: ViTMSNConfig )
引數
- config (ViTMSNConfig) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型關聯的權重,只會載入配置。要載入模型權重,請檢視 from_pretrained() 方法。
帶有影像分類頭的 Vit Msn 模型,例如用於 ImageNet。
該模型繼承自 PreTrainedModel。請檢視超類文件以瞭解該庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
該模型也是一個 PyTorch torch.nn.Module 子類。可以像常規 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< 源 >( pixel_values: typing.Optional[torch.Tensor] = None head_mask: typing.Optional[torch.Tensor] = None labels: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None interpolate_pos_encoding: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
引數
- pixel_values (
torch.Tensor
,形狀為(batch_size, num_channels, image_size, image_size)
, 可選) — 與輸入影像對應的張量。畫素值可以使用{image_processor_class}
獲得。詳情請參閱{image_processor_class}.__call__
({processor_class}
使用{image_processor_class}
處理影像)。 - head_mask (
torch.Tensor
,形狀為(num_heads,)
或(num_layers, num_heads)
, 可選) — 用於將自注意力模組中選定的頭置零的掩碼。掩碼值在[0, 1]
範圍內選擇:- 1 表示該頭未被掩碼,
- 0 表示該頭已被掩碼。
- labels (
torch.Tensor
,形狀為(batch_size, sequence_length)
,可選) — 用於計算掩碼語言建模損失的標籤。索引應在[0, ..., config.vocab_size]
範圍內或為 -100(請參閱input_ids
文件字串)。索引設定為-100
的詞元將被忽略(掩碼),損失僅針對標籤在[0, ..., config.vocab_size]
範圍內的詞元進行計算。 - output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多詳情請參閱返回張量下的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多詳情請參閱返回張量下的hidden_states
。 - interpolate_pos_encoding (
bool
, 可選) — 是否對預訓練的位置編碼進行插值。 - return_dict (
bool
, 可選) — 是否返回一個 ModelOutput 而不是一個普通的元組。
返回
transformers.modeling_outputs.ImageClassifierOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.ImageClassifierOutput 或一個 torch.FloatTensor
元組(如果傳遞了 return_dict=False
或 config.return_dict=False
),包含根據配置(ViTMSNConfig)和輸入的不同元素。
-
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, patch_size, sequence_length)
。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
ViTMSNForImageClassification 的前向方法,重寫了 __call__
特殊方法。
雖然前向傳播的流程需要在此函式內定義,但之後應呼叫 Module
例項而不是此函式,因為前者會處理預處理和後處理步驟,而後者會默默地忽略它們。
示例
>>> from transformers import AutoImageProcessor, ViTMSNForImageClassification
>>> import torch
>>> from PIL import Image
>>> import requests
>>> torch.manual_seed(2)
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/vit-msn-small")
>>> model = ViTMSNForImageClassification.from_pretrained("facebook/vit-msn-small")
>>> inputs = image_processor(images=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])
tusker