詳細なビジョントランスフォーマー

紙の名前:画像は16x16の価値があります単語:大規模な画像認識のためのトランスフォーマー
紙のダウンロードリンク:https
://arxiv.org/abs/2010.11929元の紙の対応するソースコード:https ://github.com/google- research /vision_transformer

Pytorch実装コード:pytorch_classification /vision_transformer Tensorflow2
実装コード:tensorflow_classification /vision_transformer
bilibiliに関するビデオの説明:https ://www.bilibili.com/video/BV1Jh411Y7WQ



序文

トランスフォーマーは元々NLP分野で提案され、NLP分野で非常に成功しています。この論文もそれに触発され、TransformerをCVフィールドに適用しようとしています。Transformerの理論の一部は、以前のブログ投稿で言及されており、リンクはここでは繰り返されません。この記事の実験を通じて、与えられた最良のモデルはImageNet1K(Google独自のJFTデータセットで事前トレーニング済み)で88.55%の精度を達成でき、TransformerがCV分野で実際に効果的であることを示しています。その効果は非常に驚くべきものです。

vit


モデルの詳細

この記事では、著者は主にResNetの3つのモデル、ViT(純粋なTransformerモデル)とHybrid(畳み込みとTransformerハイブリッドモデル)を比較します。このブログ投稿では、ViTモデルに加えてHybridモデルについて簡単に説明します。

ビジョントランスフォーマーモデル詳細な説明

次の図は、元の論文で提供されているVision Transformer(ViT)のモデルフレームワークです。簡単に言うと、モデルは3つのモジュールで構成されています。

  • 平坦化されたパッチの線形射影(埋め込み層)
  • トランスフォーマーエンコーダー(より詳細な構造は図の右側に示されています)
  • MLPヘッド(最終的に分類に使用されるレイヤー構造)
    vit

埋め込み層構造の詳細な説明

標準のTransformerモジュールの場合、入力はトークン(ベクトル)のシーケンスです。つまり、次の図に示すように、2次元行列[num_token、token_dim]です。tokens0-9はベクトルに対応し、ViT-B/を取ります。例として16、各トークンベクトルの長さは768です。

エンコーダー
画像データの場合、データ形式は[H、W、C]です。これは、明らかにTransformerが望んでいるものではない3次元行列です。したがって、最初に埋め込みレイヤーを介してデータを変換する必要があります。次の図に示すように、最初に画像を特定のサイズに応じてパッチの束に分割します。ViT-B / 16を例にとると、入力画像(224x224)を16x16サイズのパッチに従って分割すると、分割後、(224/16)2 = 196(224/16)^ 2=196になります。2 2 4/1 6 _ _2=196パッチ _ 次に、線形マッピングを使用して各パッチを1次元ベクトルにマッピングします。ViT-B/ 16を例にとると、各パッチデータの形状は[16、16、3]です。長さ768のベクトルは、マッピングによって取得されます(以下は直接トークンと呼ばれます)。[16, 16, 3] -> [768]

コードの実装では、畳み込み層を介して直接実装されます。ViT-B / 16を例にとると、畳み込みカーネルサイズが16x16、ストライドが16、畳み込みカーネル番号が768の畳み込みが直接使用されます。畳み込み[224, 224, 3] -> [14, 14, 768]を経て、HとWの2次元を平坦化する[14, 14, 768] -> [196, 768]と、2次元の行列になります。これは、まさにTransformerが望んでいるものです。

Transformer Encoderに入る前に、[class]tokenとPositionEmbeddingを追加する必要があることに注意してください。原論文では、BERTを参考に、取得したトークンの山に分類専用の[クラス]トークンを挿入すると述べています。この[クラス]トークンはトレーニング可能なパラメータであり、データ形式は他と同じです。トークン。ViT-B/16を例にとると、ベクトルは長さ768のベクトルであり、画像から以前に生成されたトークンとスプライスされCat([1, 768], [196, 768]) -> [197, 768]ます。次に、Position Embeddingについては、Transformerで言及されているPositional Encodingです。ここでのPositionEmbedding1D Pos. Emb.は、トークンに直接重ねられる(add)トレーニング可能なパラメーター()を使用するため、形状は同じである必要があります。ViT-B / 16を例にとると、[class]トークンがスプライスされ[197, 768]た後の形状はであり、ここでの位置埋め込みの形状も[197, 768]です。

埋め込み

位置埋め込みの作成者も一連の比較実験を行いました。ソースコードでのデフォルトの使用法は、1D Pos. Emb.位置埋め込みなしの比較の精度が約3ポイント向上することです。これ2D Pos. Emb.は、比較と大差ありません。
位置の埋め込み


トランスフォーマーエンコーダーの詳細

Transformer Encoderは、実際にはEncoder BlockをL回繰り返し積み重ねたものです。次の図は、私が描いたEncoder Blockで、主に次の部分で構成されています。

  • レイヤーノルム、この正規化方法は主にNLPフィールドに対して提案されています。これが各トークンのノルム処理です。レイヤーノルムが理解できないことも前に述べましたが、リンクを参照してください。
  • マルチヘッド注意、この構造は以前にTransformerで詳細に説明されていたので、繰り返しません。理解できない場合は、リンクを参照してください。
  • Dropout / DropPath、元の論文のコードで直接使用されるDropoutレイヤーですがrwightman、実装されたコードではDropPath(確率的深さ)が使用されます。
  • 図の右側に示すように、MLPブロックは、完全に接続された+ GELU活性化関数+ドロップアウトで構成されています。最初の完全に接続された層は入力ノードの数を4倍に[197, 768] -> [197, 3072]し、2番目の完全に接続された層は元のノード数に戻す[197, 3072] -> [197, 768]

エンコーダー


詳細なMLPヘッド

上記のトランスエンコーダを通過した後の出力形状と入力形状は変わりません。ViT-B/16を例にとると、入力が[197, 768]出力されるかどうか[197, 768]実際には、Transformer Encoderの後に描画されていないレイヤーノルムがあり、詳細な構造を確認するために自分で描画したViTモデルがあることに注意してください。ここでは分類情報のみが必要なので、[class] tokenによって生成された対応する結果を抽出するだけで済みます。つまり、[class]tokenの対応する結果を抽出するだけ[197, 768]です[1, 768]次に、MLPヘッドを介して最終的な分類結果を取得します。MLPヘッドの元の論文では、 ImageNet21KをトレーニングするときにLinear++で構成されているtanh激活函数と述べていLinearます。ただし、ImageNet1Kまたは独自のデータに移行する場合は、1つだけを使用してくださいLinear

mlpヘッド


自分で描いたVisionTransformerのネットワーク構造

理解を容易にするために、ソースコードに基づいてより詳細な図を描きました(例としてViT-B / 16を取り上げます)。

vit-b / 16


ハイブリッドモデルの詳細説明

この論文の4.1章ではModel Variants、ハイブリッド混合モデルについて詳しく説明しています。これは、従来のCNN特徴抽出とTransformerを組み合わせたものです。次の図は、特徴抽出器としてResNet50を使用したハイブリッドモデルを示していますが、ここでのResnetは、前述のResnetとは多少異なります。まず、ここでR50の畳み込み層で使用されているStdConv2dは従来のConv2dではなく、すべてのBatchNorm層がGroupNorm層に置き換えられています。元のResnet50ネットワークでは、stage1は3回スタックされ、stage2は4回スタックされ、stage3は6回スタックされ、stage4は3回スタックされますが、ここのR50では、stage4の3つのブロックがstage3に移動されるため、stage3スタック合計9回繰り返されます。

R50バックボーンによる特徴抽出後、取得された特徴行列の形状は[14, 14, 1024]であり、パッチ埋め込みレイヤーに入力されます。パッチ埋め込みの畳み込みレイヤーConv2dのkernel_sizeとストライドが1になり、チャネルの調整にのみ使用されることに注意してください。後半は前のViTと全く同じなので、繰り返しません。

r50 + vit-b / 16

次の表は、ViT、Resnet(前述のように、使用されている畳み込み層とNorm層が変更されています)、およびハイブリッドモデルの効果を比較するためにこの論文で使用されています。比較すると、トレーニングエポックが小さい場合はHybridがViTよりも優れているが、エポックが増加している場合はViTがHybridよりも優れていることがわかります。

vitvsハイブリッド


ViTモデル構築パラメーター

論文の表1には、ソース16x16コードのパッチサイズに加えて、3つのモデル(ベース/ラージ/ヒュージ)のパラメーターが示されています32x32レイヤーは、エンコーダーブロックがトランスフォーマーエンコーダーで繰り返しスタックされる回数であり、非表示サイズは、埋め込みレイヤーを通過した後の各トークンの薄暗い(ベクトルの長さ)であり、MLPサイズは最初に完全に接続されますTransformer EncoderのMLPブロックのノード(非表示サイズの4倍)、Headsは、TransformerのMulti-HeadAttentionのヘッドの数を表します。

モデル パッチサイズ レイヤー 隠しサイズD MLPサイズ パラメータ
ViTベース 16x16 12 768 3072 12 86M
ViT-大 16x16 24 1024 4096 16 307M
ViT-巨大 14x14 32 1280 5120 16 632M

おすすめ

転載: blog.csdn.net/qq_37541097/article/details/118242600