ここ数年にわたり、トランスフォーマーは機械学習における NLP ドメインを変革してきました。 GPT や BERT などのモデル 人間の言語の理解と生成において新たな基準を設定しました。 現在、同じ原理がコンピュータ ビジョンの分野にも適用されています。 コンピュータ ビジョンの分野における最近の発展は、ビジョンです。 トランスまたは ViT。論文「An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale」で詳しく説明されているように、 ViT とトランスベースのモデルは、畳み込みアルゴリズムを置き換えるように設計されています。 ニューラル ネットワーク (CNN)。 ビジョン トランスフォーマーは、コンピューターの問題を解決するための新しい考え方です。 ビジョン。従来の畳み込みニューラル ネットワークに依存するのではなく (CNN) は、何十年にもわたって画像関連タスクの根幹を担ってきました。 ViT は、トランスフォーマー アーキテクチャを使用して画像を処理します。彼らは治療します 文中の単語のような画像パッチを使用して、モデルが学習できるようにします。 これらのパッチ間の関係は、パッチのコンテキストを学習するのと同じように、 テキストの段落。
CNN とは異なり、ViT は入力画像をパッチに分割し、シリアル化します。 ベクトルに変換し、行列を使用して次元を削減します。 乗算。次に、トランスフォーマー エンコーダーはこれらのベクトルを次のように処理します。 トークンの埋め込み。この記事では、ビジョントランスフォーマーと 畳み込みニューラル ネットワークとの主な違い。何がそうさせるのか 彼らの特に興味深いのは、世界的なものを理解する能力です。 画像内のパターンは、CNN にとって困難な問題です。
ビジョン トランスフォーマーは、アテンションとトランスフォーマーの概念を使用して、 画像を処理する - これは自然言語のトランスフォーマーに似ています 処理 (NLP) コンテキスト。ただし、トークンを使用する代わりに、イメージは パッチに分割され、一連の線形埋め込みとして提供されます。これら パッチは、NLP でトークンや単語が扱われるのと同じ方法で扱われます。
全体像を同時に見る代わりに、ViT はカットします。 画像をジグソーパズルのように小さなピースに分割します。それぞれのピースが回転します 特徴を表す数値のリスト (ベクトル) に変換し、 モデルはすべてのピースを見て、それらがどのように関連しているかを理解します。
CNN とは異なり、ViT は特定のフィルターまたはカーネルを適用することで機能します。
エッジ パターンなどの特定の特徴を検出するための画像。これは、
畳み込みプロセスは、プリンターが画像をスキャンするのと非常によく似ています。
画像。これらのフィルターは画像全体をスライドして強調表示します。
重要な機能。その後、ネットワークは複数の層を積み重ねます。
CNN では、プーリング層により特徴マップのサイズが削減されます。これら
レイヤーは抽出された特徴を分析して、予測に役立つようにします。
画像認識、物体検出など。ただし、CNN には固定の
受容野が弱くなり、長距離をモデル化する能力が制限される
CNN はどのように画像を表示するのか?
ViT は、より多くのパラメーターがあるにもかかわらず、セルフアテンション メカニズムを使用します 特徴表現を改善し、より深い層の必要性を軽減します。 CNN では、同様の機能を実現するには、非常に深いアーキテクチャが必要です。 表現力が低下し、計算コストの増加につながります。
さらに、CNN はグローバル レベルの画像パターンをキャプチャできません。 これらのフィルターは、画像の局所領域に焦点を当てます。を理解するには、 画像全体や離れた関係など、CNN は多くのレイヤーを積み重ねることに依存します プールして視野を拡大します。ただし、このプロセスでは、 詳細を段階的に集約するため、グローバル情報は失われます。一方、
ViT は、画像をパッチに分割します。 個々の入力トークンとして扱われます。自己注意を使用して ViT を比較する すべてのパッチを同時に実行し、それらがどのように関連しているかを学びます。これにより、彼らは イメージ全体にわたるパターンと依存関係をキャプチャするため、
先に進む前に、誘導バイアスの概念を理解することが重要です。 誘導バイアスとは、モデルがデータに関して行う仮定を指します。 構造;これにより、トレーニング中にモデルがより一般化され、 偏見を減らす。 CNN では、帰納的バイアスには以下が含まれます。
これらのバイアスにより、CNN はそのままの画像タスクに対して非常に効率的になります。 本質的に画像の空間的および構造を活用するように設計されています
ビジョン トランスフォーマー (ViT) は、CNN よりも画像固有の誘導バイアスが大幅に少なくなります。 ViT 内:
ビジョン トランスフォーマーは標準のトランスフォーマー アーキテクチャを使用します 1D テキスト シーケンス用に開発されました。 2D 画像を処理するには、 P P ピクセルなどの固定サイズの小さなパッチに分割されます。 ベクトルに平坦化されます。画像の寸法が H W で C の場合 チャンネル数の場合、パッチの総数は N = H W / P P になります。 Transformer の入力シーケンスの長さ。これらの平坦化されたパッチは、 次に、パッチ埋め込みと呼ばれる固定次元空間 D に線形投影されます。
特別な学習可能なトークンは、BERT の [CLS] トークンに似ており、 パッチ埋め込みのシーケンスの先頭に追加されます。このトークンは、 後で分類に使用されるグローバルな画像表現。 さらに、位置埋め込みがパッチ埋め込みに追加されます。 位置情報をエンコードし、モデルが空間を理解できるようにします。
一連のエンベディングは Transformer エンコーダーを介して渡され、Transformer エンコーダーは 2 つの主要な操作、つまりマルチヘッド セルフ アテンション (MSA) と MLP ブロックとも呼ばれるフィードフォワード ニューラル ネットワークを交互に実行します。各レイヤーにはレイヤー正規化 (LN) が含まれています これらの操作の前に適用され、残りの接続が追加されます その後はトレーニングを安定させるため。 Transformer エンコーダーの出力、 特に [CLS] トークンの状態は、イメージの状態として使用されます。
分類のために最終的な [CLS] トークンに単純なヘッドが追加されます。 タスク。事前トレーニング中、このヘッドは小さな多層パーセプトロンです (MLP)、微調整中は通常、単一の線形レイヤーになります。これ アーキテクチャにより、ViT はグローバルな関係を効果的にモデル化できます パッチ間で画像に対する自己注意力を最大限に活用します。
ハイブリッド Vision Transformer モデルでは、直接分割するのではなく、 RAW 画像をパッチに変換し、入力シーケンスは特徴マップから派生します CNN によって生成されました。 CNN は最初に画像を処理し、抽出します。 意味のある空間特徴を抽出し、パッチの作成に使用します。 これらのパッチは平坦化され、固定次元の空間に投影されます。 標準の Vision と同じトレーニング可能な線形投影を使用する トランスフォーマー。このアプローチの特殊なケースは、次のサイズのパッチを使用することです。 1×1。各パッチは、空間内の 1 つの空間位置に対応します。 CNN の特徴マップ。
この場合、特徴マップの空間次元は次のとおりです。 平坦化され、結果のシーケンスが トランスの入力寸法。標準の ViT と同様に、 分類トークンと位置埋め込みが追加されて保持されます。 位置情報を取得し、グローバルな画像の理解を可能にします。これ CNN の局所特徴抽出の強みを活用したハイブリッド アプローチ それらをグローバル モデリング機能と組み合わせながら、 トランスフォーマー。
これは、ビジョン トランスフォーマーの使用方法に関するコード ブロックです。画像。
# Install the necessary libraries pip install -q transformers
from transformers import ViTForImageClassification from PIL import Image from transformers import ViTImageProcessor
import requests import torch
# Load the model and move it to ‘GPU’ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224') model.to(device)
# Load the ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン to perform predictions url = 'link to your ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン' ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224') inputs = processor(ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンs=ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン, return_tensors="pt").to(device) pixel_values = inputs.pixel_values # print(pixel_values.shape)
ViTモデルは画像を処理します。 BERT のようなエンコーダと 線形分類ヘッドは、最終的な隠れ状態の上に配置されます。 [CLS] トークン。
with torch.no_grad(): outputs = model(pixel_values) logits = outputs.logits# logits.shapeprediction = logits.argmax(-1) print("Predicted class:", model.config.id2label[prediction.item()])
は次のとおりです PyTorch を使用した基本的な Vision Transformer (ViT) の実装。これ コードには、パッチの埋め込み、位置エンコーディング、 これは簡単な分類に使用できます。 タスク。
import torchimport torch.nn as nnimport torch.nn.functional as Fclass VisionTransformer(nn.Module): def __init__(self, img_size=224, patch_size=16, num_classes=1000, dim=768, depth=12, heads=12, mlp_dim=3072, dropout=0.1): super(VisionTransformer, self).__init__() # Image and patch dimensions assert img_size % patch_size == 0, "Image size must be divisible by patch size" self.num_patches = (img_size // patch_size) ** 2 self.patch_dim = (3 * patch_size ** 2) # Assuming 3 channels (RGB) # Layers self.patch_embeddings = nn.Linear(self.patch_dim, dim) self.position_embeddings = nn.Parameter(torch.randn(1, self.num_patches 1, dim)) self.cls_token = nn.Parameter(torch.randn(1, 1, dim)) self.dropout = nn.Dropout(dropout) # Transformer Encoder self.transformer = nn.TransformerEncoder( nn.TransformerEncoderLayer(d_model=dim, nhead=heads, dim_feedforward=mlp_dim, dropout=dropout), num_layers=depth ) # MLP Head for classification self.mlp_head = nn.Sequential( nn.LayerNorm(dim), nn.Linear(dim, num_classes) ) def forward(self, x): # Flatten patches and embed batch_size, channels, height, width = x.shape patch_size = height // int(self.num_patches ** 0.5) x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size) x = x.contiguous().view(batch_size, 3, patch_size, patch_size, -1) x = x.permute(0, 4, 1, 2, 3).flatten(2).permute(0, 2, 1) x = self.patch_embeddings(x) # Add positional embeddings cls_tokens = self.cls_token.expand(batch_size, -1, -1) x = torch.cat((cls_tokens, x), dim=1) x = x self.position_embeddings x = self.dropout(x) # Transformer Encoder x = self.transformer(x) # Classification Head x = x[:, 0] # CLS token return self.mlp_head(x)# Example usageif __name__ == "__main__": model = VisionTransformer(img_size=224, patch_size=16, num_classes=10, dim=768, depth=12, heads=12, mlp_dim=3072) print(model) dummy_img = torch.randn(8, 3, 224, 224) # Batch of 8 ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンs, 3 channels, 224x224 size preds = model(dummy_img) print(preds.shape) # Output: [8, 10] (Batch size, Number of classes)
以上がビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。