Transformers documentation

Dilated Neighborhood Attention Transformer

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

and get access to the augmented documentation experience

to get started

このモデルは2022年9月29日にHF papersで公開され、2022年11月18日にHugging Face Transformersに貢献されました。

Dilated Neighborhood Attention Transformer

概要

DiNATは、Ali Hassani氏とHumphrey Shi氏によるDilated Neighborhood Attention Transformerで提案されました。

NATを拡張し、Dilated Neighborhood Attentionパターンを追加してグローバルなコンテキストを捉えることで、それに対する顕著なパフォーマンスの向上を示しています。

論文の抄録は以下の通りです。

Transformers は、モダリティ、ドメイン、タスクを問わず、最も広く応用されている深層学習アーキテクチャの一つになりつつあります。ビジョン分野では、プレーンな Transformer への継続的な取り組みに加え、その性能と既存フレームワークへの容易な統合性のおかげで、階層型 Transformer も大きな注目を集めています。これらのモデルは、スライディングウィンドウの Neighborhood Attention (NA) や Swin Transformer の Shifted Window Self Attention のような、局所化されたアテンション機構を典型的に採用しています。自己アテンションの二次的な計算量を削減する点では効果的ですが、局所アテンションは、自己アテンションの最も望ましい特性である長距離の相互依存関係のモデリングと、グローバルな受容野の2つを弱めてしまいます。本論文では、Neighborhood Attention (NA) の自然で柔軟かつ効率的な拡張である Dilated Neighborhood Attention (DiNA) を提案します。DiNA は追加のコストなしによりグローバルなコンテキストを捉え、受容野を指数関数的に拡大できます。NA の局所アテンションと DiNA のスパースなグローバルアテンションは互いを補完し合うため、両方を基盤とする新しい階層型ビジョン Transformer、Dilated Neighborhood Attention Transformer (DiNAT) を提案します。DiNAT の各バリアントは、NAT、Swin、ConvNeXt といった強力なベースラインと比較して大幅な改善を実現しています。私たちの大規模モデルは、Swin の同等モデルよりも速く、COCO オブジェクト検出で box AP 1.5%、COCO インスタセグメンテーションで mask AP 1.3%、ADE20K セマンティックセグメンテーションで mIoU 1.1% 上回っています。新しいフレームワークと組み合わせることで、私たちの大規模バリアントは、COCO (58.2 PQ) と ADE20K (48.5 PQ) のパノプティックセグメンテーション、Cityscapes (44.5 AP) と ADE20K (35.4 AP) のインスタセグメンテーションにおいて、新たな最良の性能 (state of the art) を達成しました (追加データなし)。また、ADE20K (58.2 mIoU) のセマンティックセグメンテーションでは最良の性能を達成し、Cityscapes (84.5 mIoU) では2位にランクインしています (追加データなし)。

drawing Neighborhood Attention with different dilation values. Taken from the original paper.

このモデルはAli Hassaniによって提供されました。 元のコードはこちらで確認できます。

使用のコツ

DiNATはbackboneとして使用できます。output_hidden_states = Trueの場合、hidden_statesとreshaped_hidden_statesの両方が出力されます。reshaped_hidden_statesの形状は(batch_size, height, width, num_channels)ではなく(batch, num_channels, height, width)です。

注:

  • DiNATは、NATTENによるNeighborhood AttentionおよびDilated Neighborhood Attentionの実装に依存しています。 Linux向けには、shi-labs.com/nattenを参照して事前構築済みのwheelをインストールできます。また、pip install nattenを実行してシステム上でビルドすることも可能です。 後者の場合、コンパイルに時間がかかる可能性があります。なお、NATTENは現時点ではWindowsデバイスに対応していません。
  • 現時点では、4のPatch sizeのみサポートされています。

リソース

DiNATの入門を支援するための、Hugging Face公式およびコミュニティ(🌎で示す)のリソースのリストです。

Image Classification

ここにリソースを掲載していただくことを希望される場合は、Pull Request を開いてください。レビューいたします。リソースは、既存のリソースと重複するのではなく、新しいものを示すことが望ましいです。

DinatConfig

class transformers.DinatConfig

< >

( 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 = Nonepatch_size: int | list[int] | tuple[int, int] = 4num_channels: int = 3embed_dim: int = 64depths: list[int] | tuple[int, ...] = (3, 4, 6, 5)num_heads: list[int] | tuple[int, ...] = (2, 4, 8, 16)kernel_size: int = 7dilations: list | tuple | None = Nonemlp_ratio: float = 3.0qkv_bias: bool = Truehidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0drop_path_rate: float | int = 0.1hidden_act: str = 'gelu'initializer_range: float = 0.02layer_norm_eps: float = 1e-05layer_scale_init_value: float = 0.0_out_features: list[str] | None = None_out_indices: list[int] | None = None )

パラメータ

  • patch_size (Union[int, list[int], tuple[int, int]]、省略可、デフォルトは4) — 各パッチのサイズ(解像度)です。
  • num_channels (int、任意、デフォルトは3) — 入力チャネル数。
  • embed_dim (int、任意、デフォルトは64) — 埋め込みおよび隠れ状態の次元数。
  • depths (Union[list[int], tuple[int, ...]]、任意、デフォルトは(3, 4, 6, 5)) — Transformerの各層の深さです。
  • num_heads (Union[list[int], tuple[int, ...]]、任意、デフォルトは (2, 4, 8, 16)) — Transformer デコーダーの各アテンション層におけるアテンションヘッドの数。
  • kernel_size (int、任意、デフォルトは7) — 畳み込みカーネルのサイズです。
  • dilations (list[list[int]]、任意、デフォルトは[[1, 8, 1], [1, 4, 1, 4], [1, 2, 1, 2, 1, 2], [1, 1, 1, 1, 1]]) — Transformerエンコーダーの各NA層のDilation値です。
  • mlp_ratio (float、任意、デフォルトは 3.0) — MLP の隠れ層の次元と埋め込み次元の比率です。
  • qkv_bias (bool、省略可、デフォルトは True) — クエリ、キー、バリューにバイアスを追加するかどうか。
  • hidden_dropout_prob (Union[float, int]、任意、デフォルト値は0.0) — embeddings、encoder、pooler 内のすべての全結合層における dropout 確率です。
  • attention_probs_dropout_prob (Union[float, int]、任意、デフォルトは 0.0) — アテンション確率のドロップアウト率です。
  • drop_path_rate (Union[float, int]、省略可、デフォルトは 0.1) — パッチ融合におけるドロップパス率。
  • hidden_act (str、任意、デフォルトは gelu) — デコーダーで使用する非線形活性化関数(関数または文字列)。例えば、"gelu"、 "relu"、"silu" など。
  • initializer_range (float、任意、デフォルトは 0.02) — すべての重み行列を初期化するための truncated_normal_initializer の標準偏差です。
  • layer_norm_eps (float、任意、デフォルトは 1e-05) — レイヤーノーマル層で使用する epsilon です。
  • layer_scale_init_value (float、任意、デフォルトは 0.0) — 自己アテンション層で使用するスケール値です。base モデルでは 0.1、large モデルでは 1e-6 を使用します。0 に設定すると、layer scale を無効にします。

これは DinatModel の設定を保存するための設定クラスです。指定された引数に基づいて Dinat モデルをインスタンス化し、モデルのアーキテクチャを定義するために使用されます。デフォルト値で設定をインスタンス化すると、shi-labs/dinat-mini-in1k-224 と同様の設定が得られます。

設定オブジェクトはPreTrainedConfigを継承し、モデルの出力を制御するために使用できます。詳細については、PreTrainedConfigのドキュメントを参照してください。

例:

>>> from transformers import DinatConfig, DinatModel

>>> # Initializing a Dinat shi-labs/dinat-mini-in1k-224 style configuration
>>> configuration = DinatConfig()

>>> # Initializing a model (with random weights) from the shi-labs/dinat-mini-in1k-224 style configuration
>>> model = DinatModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

DinatModel

クラス transformers.DinatModel

< >

( config: DinatConfigadd_pooling_layer = True )

パラメータ

  • config (DinatConfig) — モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
  • add_pooling_layer (bool、省略可、デフォルトはTrue) — プーリング層を追加するかどうか

特定のヘッドを上に載せず、生のhidden-statesを出力する素のDinat Model。

このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。

このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。

forward

< >

( pixel_values: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DinatModelOutput or tuple(torch.Tensor)

パラメータ

  • pixel_values (torch.Tensor、形状 (batch_size, num_channels, image_size, image_size)、任意) — 入力画像に対応するテンソルです。ピクセル値は ViTImageProcessor を使用して取得できます。詳細については ViTImageProcessor.call() を参照してください(processor_class は画像の処理に ViTImageProcessor を使用します)。
  • output_attentions (bool, 省略可) — すべてのアテンション層のアテンションテンソルを返すかどうかを指定します。詳細は、返されるテンソルの attentions を参照してください。
  • output_hidden_states (bool, 省略可) — すべての層の hidden states を返すかどうかを指定します。詳細は、返されるテンソルの hidden_states を参照してください。
  • return_dict (bool, 任意) — プレーンなタプルではなく ModelOutput を返すかどうか。

戻り値

DinatModelOutput または tuple(torch.Tensor)

DinatModelOutput、またはtorch.Tensorのタプル(return_dict=Falseが渡された場合、またはconfig.return_dict=Falseの場合)。設定(DinatConfig)と入力に応じて、さまざまな要素で構成されます。

DinatModelのforwardメソッドは、__call__特殊メソッドをオーバーライドします。

この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなくModuleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。

  • last_hidden_state (torch.Tensor、形状 (batch_size, sequence_length, hidden_size)、任意) — モデルの最終層の出力における隠れ状態のシーケンス。

  • pooler_output (torch.Tensor、形状 (batch_size, hidden_size)、任意、add_pooling_layer=True が渡された場合に返されます) — 最終層の隠れ状態の平均プーリング。

  • hidden_states (tuple[torch.Tensor, ...]、optional、output_hidden_states=True が渡された場合または config.output_hidden_states=True の場合に返されます) — torch.Tensor のタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は (batch_size, sequence_length, hidden_size) です。

    各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。

  • attentions (tuple[torch.Tensor, ...]、optional、output_attentions=True が渡された場合または config.output_attentions=True の場合に返されます)— torch.Tensor のタプル(各レイヤーごとに1つ)で、形状は (batch_size, num_heads, sequence_length, sequence_length) です。

    アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。

  • reshaped_hidden_states (tuple(torch.Tensor)、任意、output_hidden_states=True が渡された場合または config.output_hidden_states=True の場合に返されます) — torch.Tensor のタプル(埋め込みの出力用 1 つ + 各ステージの出力用 1 つ)、形状は (batch_size, hidden_size, height, width)。

    各層の出力におけるモデルのHidden-states、および空間次元を含むように整形された初期埋め込み出力。

例:

DinatForImageClassification

class transformers.DinatForImageClassification

< >

( config: DinatConfig )

パラメータ

  • config (DinatConfig) — モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。

Dinat Model は、最終的な隠れ状態の [CLS] トークン上に線形層を配置した画像分類ヘッドを備えた transformer です。ImageNet などの用途に使用できます。

このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。

このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。

forward

< >

( pixel_values: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DinatImageClassifierOutput or tuple(torch.Tensor)

パラメータ

  • pixel_values (torch.Tensor、形状 (batch_size, num_channels, image_size, image_size)、任意) — 入力画像に対応するテンソルです。ピクセル値は ViTImageProcessor を使用して取得できます。詳細については ViTImageProcessor.call() を参照してください(processor_class は画像の処理に ViTImageProcessor を使用します)。
  • 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 を返すかどうか。

戻り値

DinatImageClassifierOutput または tuple(torch.Tensor)

DinatImageClassifierOutput、またはtorch.Tensorのタプル(return_dict=Falseが渡された場合、またはconfig.return_dict=Falseの場合)。設定(DinatConfig)と入力に応じて、さまざまな要素で構成されます。

DinatForImageClassificationのforwardメソッドは、__call__特殊メソッドをオーバーライドします。

この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなくModuleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。

  • loss (torch.Tensor、shape (1,)、optional、labels が指定された場合に返されます) — 分類損失(config.num_labels==1 の場合は回帰損失)。

  • logits (torch.Tensor、形状 (batch_size, config.num_labels)) — SoftMax 適用前の分類(または config.num_labels==1 の場合は回帰)スコア。

  • hidden_states (tuple[torch.Tensor, ...]、optional、output_hidden_states=True が渡された場合または config.output_hidden_states=True の場合に返されます) — torch.Tensor のタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は (batch_size, sequence_length, hidden_size) です。

    各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。

  • attentions (tuple[torch.Tensor, ...]、optional、output_attentions=True が渡された場合または config.output_attentions=True の場合に返されます)— torch.Tensor のタプル(各レイヤーごとに1つ)で、形状は (batch_size, num_heads, sequence_length, sequence_length) です。

    アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。

  • reshaped_hidden_states (tuple(torch.Tensor)、任意、output_hidden_states=True が渡された場合または config.output_hidden_states=True の場合に返されます) — torch.Tensor のタプル(埋め込みの出力用 1 つ + 各ステージの出力用 1 つ)、形状は (batch_size, hidden_size, height, width)。

    各層の出力におけるモデルのHidden-states、および空間次元を含むように整形された初期埋め込み出力。

例:

>>> from transformers import AutoImageProcessor, DinatForImageClassification
>>> import torch
>>> from datasets import load_dataset

>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]

>>> image_processor = AutoImageProcessor.from_pretrained("shi-labs/dinat-mini-in1k-224")
>>> model = DinatForImageClassification.from_pretrained("shi-labs/dinat-mini-in1k-224")

>>> 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])
...
Update on GitHub