ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン
ここ数年にわたり、トランスフォーマーは機械学習における 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 では、帰納的バイアスには以下が含まれます。
- 局所性: 画像内の特徴 (エッジやテクスチャなど) は小さな領域内に局在化されます。
- 2 次元近傍構造: 近くのピクセルである可能性が高くなります。
- 変換等分散: 一部で検出された特徴。画像は、エッジと同様、別の部分に表示されても同じ意味を保持します。
これらのバイアスにより、CNN はそのままの画像タスクに対して非常に効率的になります。 本質的に画像の空間的および構造を活用するように設計されています
ビジョン トランスフォーマー (ViT) は、CNN よりも画像固有の誘導バイアスが大幅に少なくなります。 ViT 内:
- グローバル処理: セルフアテンション層が動作します 画像全体をモデルにグローバルな関係をキャプチャさせ、
- 最小 2D 構造: 画像の 2D 構造 先頭(画像をパッチに分割するとき)のみ使用 および微調整中(さまざまな位置の埋め込みを調整するため) 決議)。 CNN とは異なり、ViT は近くのピクセルが
- 学習された空間関係: における位置埋め込み ViT は、初期化時に特定の 2D 空間関係をエンコードしません。 代わりに、モデルはデータからすべての空間関係を学習します。
ビジョン トランスフォーマーの仕組み
ビジョン トランスフォーマーは標準のトランスフォーマー アーキテクチャを使用します 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

PythonListSarePartOfThestAndardarenot.liestareBuilting-in、versatile、forStoringCollectionsのpythonlistarepart。

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

PythonとCにはそれぞれ独自の利点があり、選択はプロジェクトの要件に基づいている必要があります。 1)Pythonは、簡潔な構文と動的タイピングのため、迅速な開発とデータ処理に適しています。 2)Cは、静的なタイピングと手動メモリ管理により、高性能およびシステムプログラミングに適しています。
