Transformers documentation
Pyramid Vision Transformer V2 (PVTv2)
このモデルは2021年6月25日にHF papersで公開され、2024年3月13日にHugging Face Transformersに貢献されました。
Pyramid Vision Transformer V2 (PVTv2)
概要
PVTv2モデルは、Wenhai Wang、Enze Xie、Xiang Li、Deng-Ping Fan、Kaitao Song、Ding Liang、Tong Lu、Ping Luo、Ling Shao によって提案された PVT v2: Improved Baselines with Pyramid Vision Transformer に記載されています。PVTの改良版として、位置埋め込みを排除し、代わりにゼロパディングと重複するパッチ埋め込みによってエンコードされる位置情報に依存しています。この位置埋め込みへの依存性の排除により、アーキテクチャが簡素化され、それらの補間を行うことなく任意の解像度で推論を実行できるようになります。
PVTv2エンコーダー構造は、セマンティックセグメンテーションのSegformer、単眼深度推定のGLPN、パノプティックセグメンテーションのPanoptic Segformerにおいて、最先端のスコアを達成するために正常にデプロイされました。
PVTv2 は、階層型トランスフォーマー と呼ばれるモデルファミリーに属しています。このファミリーは、マルチスケールの特徴マップを生成するためにトランスフォーマー層に適応を加えます。Vision Transformer (ViT) の列状構造は微細な詳細を失う傾向がありますが、マルチスケールの特徴マップはこれらの詳細を保持し、高密度予測タスクの性能向上に寄与することが知られています。PVTv2 の場合、これは各エンコーダー層において、重なり合うカーネルを用いた 2 次元畳み込みで画像パッチトークンを生成することによって実現されています。
階層型 Transformer のマルチスケール特徴により、ResNet などの従来の主力コンピュータビジョンバックボーンモデルを、より大規模なアーキテクチャ内で容易に置き換えることができます。Segformer と Panoptic Segformer の両方で、バックボーンに PVTv2 を使用した構成が、同サイズの ResNet バックボーンを使用する構成を一貫して上回ることが示されました。
PVTv2のもう一つの強力な機能は、Spatial Reduction Attention (SRA) と呼ばれる自己アテンション層の複雑さの低減です。SRA は 2D 畳み込み層を使用して、クエリでアテンションを行う前に隠れ状態をより低い解像度に射影し、 自己アテンションの複雑さを $O(n^2/R)$ に低減します。ここで は空間削減比 (sr_ratio, 2D 畳み込みにおけるカーネルサイズとストライドに相当) です。
SRA は PVT で導入され、PVTv2 で使用されるデフォルトの注意複雑度削減手法です。ただし、PVTv2 では、画像サイズに線形に関連する複雑度を持つ自己注意機構を使用するオプションも導入されており、これは「Linear SRA」と呼ばれています。この手法は、平均プーリングを使用して隠れ状態を元の解像度に依存しない固定サイズに削減します(ただし、これは通常の SRA よりも本質的に多くの情報を失います)。このオプションは、PVTv2Config で linear_attention を True に設定することで有効にできます。
論文からの抜粋
Transformer は、コンピュータビジョン分野で近年、有望な進歩を遂げています。本稿では、元の Pyramid Vision Transformer (PVT v1) に 3 つの設計要素、すなわち (1) 線形計算量の attention レイヤー、(2) 重複する patch embedding、(3) 畳み込みフィードフォワードネットワークを追加することで、新たなベースラインを提案します。これらの改良により、PVT v2 は PVT v1 の計算複雑さを線形に低減し、分類、検出、セグメンテーションといった基本的なビジョンタスクにおいて大幅な性能向上を達成しました。特に、提案する PVT v2 は、Swin Transformer などの最近の研究と比較して同等以上の性能を示しています。本稿が、コンピュータビジョンにおける最先端の Transformer 研究の発展に貢献することを期待しています。コードは https://github.com/whai362/PVT で入手できます。
このモデルはFoamoftheSeaによって提供されました。元のコードはこちらで確認できます。
使用のコツ
PVTv2 は階層型 Transformer モデルであり、画像分類をはじめとする複数のタスクで優れた性能を示しています。Segformer におけるセマンティックセグメンテーション、GLPN における単眼深度推定、Panoptic Segformer におけるパノプティックセグメンテーションのバックボーンとして使用されており、同様の ResNet 構成と比較して一貫して高い性能を発揮しています。
PVTv2のような階層型transformersは、エンコーダーに畳み込みニューラルネットワーク(CNN)の設計要素を取り入れることで、純粋なtransformersアーキテクチャと比較して、画像データにおいて優れたデータ効率とパラメータ効率を実現します。これにより、transformersの自己注意機構が提供する動的なデータ応答とグローバルな関係モデリングの利点を享受しつつ、ネットワークにCNNの有用な帰納的バイアス(移動等変性や局所性など)を付与する、両者の長所を兼ね備えたアーキテクチャが構築されます。
PVTv2 は、重複するパッチ埋め込みを使用してマルチスケールの特徴マップを作成し、ゼロパディングと深度方向畳み込みを用いて位置情報を付与します。
アテンション層の複雑さを低減するために、PVTv2 は、ストライド付き 2D 畳み込み (SRA) または固定サイズのアベレージプーリング (Linear SRA) を使用して、隠れ状態に対して空間的削減を行います。Linear SRA は本質的に損失が大きく、画像サイズに対して線形な複雑さを持ちながら、優れたパフォーマンスを発揮します。自己アテンション層で Linear SRA を使用するには、
PvtV2Configでlinear_attention=Trueを設定します。PvtV2Model は階層型 Transformer エンコーダーです(文献では Mix Transformer や MiT と呼ばれることも多いです)。PvtV2ForImageClassification はその上にシンプルな分類ヘッドを追加して、Image Classification を行います。
PvtV2Backboneは、Deformable DETR のような大規模なアーキテクチャにおいて AutoBackbone システムと組み合わせて使用できます。すべてのモデルサイズに対応したImageNet事前学習済み重みは、ハブで入手できます。
PVTv2の使い方を始める最善の方法は、
AutoModelForImageClassificationを使用して、希望するサイズの事前学習済みチェックポイントをロードすることです:
import requests
import torch
from PIL import Image
from transformers import AutoImageProcessor, AutoModelForImageClassification
model = AutoModelForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0", device_map="auto")
image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))DeformableDETRのようなより複雑なアーキテクチャのバックボーンとしてPVTv2を使用するには、AutoBackboneを使用できます(事前学習済みモデルのバックボーンを置き換えるため、このモデルはランダムな重みで初期化され、ファインチューニングが必要です):
import requests
import torch
from PIL import Image
from transformers import AutoConfig, AutoImageProcessor, AutoModelForObjectDetection
model = AutoModelForObjectDetection.from_config(
config=AutoConfig.from_pretrained(
"SenseTime/deformable-detr",
backbone_config=AutoConfig.from_pretrained("OpenGVLab/pvt_v2_b5"),
),
)
image_processor = AutoImageProcessor.from_pretrained("SenseTime/deformable-detr")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))モデルサイズ(B0-B5)別のImageNet-1KにおけるPVTv2の性能:
| メソッド | サイズ | Acc@1 | #パラメータ数 (M) |
|---|---|---|---|
| PVT-V2-B0 | 224 | 70.5 | 3.7 |
| PVT-V2-B1 | 224 | 78.7 | 14.0 |
| PVT-V2-B2-Linear | 224 | 82.1 | 22.6 |
| PVT-V2-B2 | 224 | 82.0 | 25.4 |
| PVT-V2-B3 | 224 | 83.1 | 45.2 |
| PVT-V2-B4 | 224 | 83.6 | 62.6 |
| PVT-V2-B5 | 224 | 83.8 | 82.0 |
PvtV2Config
クラス transformers.PvtV2Config
< 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 = Noneimage_size: int | list[int] | tuple[int, int] | dict = 224num_channels: int = 3num_encoder_blocks: int = 4depths: list[int] | tuple[int, ...] = (2, 2, 2, 2)sr_ratios: list[int] | tuple[int, ...] = (8, 4, 2, 1)hidden_sizes: list[int] | tuple[int, ...] = (32, 64, 160, 256)patch_sizes: list[int] | tuple[int, ...] = (7, 3, 3, 3)strides: list[int] | tuple[int, ...] = (4, 2, 2, 2)num_attention_heads: list[int] | tuple[int, ...] = (1, 2, 5, 8)mlp_ratios: list[int] | tuple[int, ...] = (8, 8, 4, 4)hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0initializer_range: float = 0.02drop_path_rate: float | int = 0.0layer_norm_eps: float = 1e-06qkv_bias: bool = Truelinear_attention: bool = False_out_features: list[str] | None = None_out_indices: list[int] | None = None )
パラメータ
- image_size (
Union[int, list[int], tuple[int, int], dict]、任意、デフォルトは224) — 各画像のサイズ(解像度)です。 - num_channels (
int、任意、デフォルトは3) — 入力チャネル数。 - num_encoder_blocks (
[int]、任意、デフォルト値は 4) — エンコーダーブロックの数(つまり、Mix Transformer エンコーダーのステージ数)。 - depths (
Union[list[int], tuple[int, ...]]、任意、デフォルトは(2, 2, 2, 2)) — Transformer の各層の深さです。 - sr_ratios (
list[int]、任意、デフォルトは[8, 4, 2, 1]) — 各エンコーダーブロックにおける空間的縮小率です。 - hidden_sizes (
Union[list[int], tuple[int, ...]]、任意、デフォルトは(32, 64, 160, 256)) — モデルの各ステージにおける次元数(隠れサイズ)。 - patch_sizes (
list[int]、任意、デフォルトは[7, 3, 3, 3]) — 各エンコーダーブロックの前に適用される、重複するパッチ埋め込みのパッチサイズ。 - strides (
list[int]、任意、デフォルトは[4, 2, 2, 2]) — 各エンコーダーブロックの前に適用される、重複するパッチ埋め込みのストライドです。 - num_attention_heads (
list[int]、任意、デフォルトは[1, 2, 5, 8]) — Transformerエンコーダーの各ブロックにおける、各アテンション層のアテンションヘッド数。 - mlp_ratios (
list[int]、任意、デフォルトは[8, 8, 4, 4]) — エンコーダーブロック内の Mix FFN において、隠れ層のサイズを入力層のサイズと比較した比率です。 - hidden_act (
str、任意、デフォルトはgelu) — デコーダーで使用する非線形活性化関数(関数または文字列)。例えば、"gelu"、"relu"、"silu"など。 - hidden_dropout_prob (
Union[float, int]、任意、デフォルト値は0.0) — embeddings、encoder、pooler 内のすべての全結合層における dropout 確率です。 - attention_probs_dropout_prob (
Union[float, int]、任意、デフォルトは0.0) — アテンション確率のドロップアウト率です。 - initializer_range (
float、任意、デフォルトは0.02) — すべての重み行列を初期化するための truncated_normal_initializer の標準偏差です。 - drop_path_rate (
Union[float, int]、任意、デフォルトは0.0) — パッチ融合におけるドロップパスの率。 - layer_norm_eps (
float、任意、デフォルトは1e-06) — レイヤーノーマル層で使用する epsilon です。 - qkv_bias (
bool、省略可、デフォルトはTrue) — クエリ、キー、バリューにバイアスを追加するかどうか。 - linear_attention (
bool、任意、デフォルトはFalse) — 線形アテンションの計算量を使用します。True に設定すると、sr_ratioは無視され、アテンション層における次元削減にストライド付き畳み込みではなく平均プーリングが使用されます。
これは PvtV2Model の設定を保存するための設定クラスです。指定された引数に基づいて Pvt V2 モデルをインスタンス化し、モデルのアーキテクチャを定義するために使用されます。デフォルト値で設定をインスタンス化すると、OpenGVLab/pvt_v2_b0 と同様の設定が得られます。
設定オブジェクトはPreTrainedConfigを継承し、モデルの出力を制御するために使用できます。詳細については、PreTrainedConfigのドキュメントを参照してください。
例:
>>> from transformers import PvtV2Model, PvtV2Config
>>> # Initializing a pvt_v2_b0 style configuration
>>> configuration = PvtV2Config()
>>> # Initializing a model from the OpenGVLab/pvt_v2_b0 style configuration
>>> model = PvtV2Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configPvtForImageClassification
クラス transformers.PvtV2ForImageClassification
< source >( config: PvtV2Config )
パラメータ
- config (PvtV2Config) — モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
Pvt-v2 Model は、[CLS] トークンの最終的な隠れ状態の上に線形層を配置した画像分類ヘッドを備えた transformer です。ImageNet などの用途に使用できます。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
forward
< source >( pixel_values: typing.Optional[torch.Tensor]labels: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → ImageClassifierOutput or tuple(torch.FloatTensor)
パラメータ
- pixel_values (
torch.Tensor、形状(batch_size, num_channels, image_size, image_size)、任意) — 入力画像に対応するテンソルです。ピクセル値は PvtImageProcessor を使用して取得できます。詳細については PvtImageProcessor.call() を参照してください(processor_classは画像の処理に PvtImageProcessor を使用します)。 - labels (
torch.LongTensor、shape(batch_size,)、任意) — 画像分類/回帰の損失を計算するためのラベル。インデックスは[0, ..., config.num_labels - 1]の範囲である必要があります。config.num_labels == 1の場合は回帰損失(平均二乗誤差)が計算され、config.num_labels > 1の場合は分類損失(クロスエントロピー)が計算されます。 - output_attentions (
bool, 省略可) — すべてのアテンション層のアテンションテンソルを返すかどうかを指定します。詳細は、返されるテンソルのattentionsを参照してください。 - output_hidden_states (
bool, 省略可) — すべての層の hidden states を返すかどうかを指定します。詳細は、返されるテンソルのhidden_statesを参照してください。 - return_dict (
bool, 任意) — プレーンなタプルではなく ModelOutput を返すかどうか。
戻り値
ImageClassifierOutput または tuple(torch.FloatTensor)
torch.FloatTensor のタプル、または ImageClassifierOutput(return_dict=False が渡された場合、または config.return_dict=False の場合)。設定(PvtV2Config)や入力に応じて、さまざまな要素で構成されます。
PvtV2ForImageClassificationのforwardメソッドは、__call__特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
loss (
torch.FloatTensor、shape(1,)、optional、labelsが指定された場合に返されます) — 分類損失(config.num_labels==1 の場合は回帰損失)。logits (
torch.FloatTensor、shape(batch_size, config.num_labels)) — SoftMax 適用前の分類スコア(config.num_labels==1 の場合は回帰スコア)。hidden_states (
tuple(torch.FloatTensor)、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます) —torch.FloatTensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力用が 1 つ、各ステージの出力用がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各ステージの出力におけるモデルの隠れ状態(特徴マップとも呼ばれます)。attentions (
tuple(torch.FloatTensor)、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます)—torch.FloatTensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, patch_size, sequence_length)。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。
例:
>>> from transformers import AutoImageProcessor, PvtV2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> model = PvtV2ForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> 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])
...PvtModel
クラス transformers.PvtV2Model
< source >( config: PvtV2Config )
パラメータ
- config (PvtV2Config) — モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
特定のヘッドが上に付いていない、生のhidden-statesを出力する素のPvt V2 Model。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
forward
< source >( pixel_values: FloatTensoroutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → BaseModelOutput or tuple(torch.FloatTensor)
パラメータ
- pixel_values (
torch.FloatTensor、shape(batch_size, num_channels, image_size, image_size)) — 入力画像に対応するテンソルです。ピクセル値はPvtImageProcessorを使用して取得できます。詳細はPvtImageProcessor.call()を参照してください(processor_classは画像の処理にPvtImageProcessorを使用します)。 - output_attentions (
bool, 省略可) — すべてのアテンション層のアテンションテンソルを返すかどうかを指定します。詳細は、返されるテンソルのattentionsを参照してください。 - output_hidden_states (
bool, 省略可) — すべての層の hidden states を返すかどうかを指定します。詳細は、返されるテンソルのhidden_statesを参照してください。 - return_dict (
bool, 任意) — プレーンなタプルではなく ModelOutput を返すかどうか。
戻り値
BaseModelOutput または tuple(torch.FloatTensor)
torch.FloatTensor のタプル、または BaseModelOutput(return_dict=False が渡された場合、または config.return_dict=False の場合)。設定(PvtV2Config)と入力に応じて、さまざまな要素で構成されます。
PvtV2Modelのforwardメソッドは、__call__特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
last_hidden_state (
torch.FloatTensor、shape(batch_size, sequence_length, hidden_size)) — モデルの最終層の出力における隠れ状態のシーケンス。hidden_states (
tuple(torch.FloatTensor)、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます)—torch.FloatTensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。
attentions (
tuple(torch.FloatTensor)、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます)—torch.FloatTensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, sequence_length, sequence_length)。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。