In den letzten Jahren haben Transformatoren den NLP-Bereich im maschinellen Lernen verändert. Modelle wie GPT und BERT haben neue Maßstäbe beim Verstehen und Erzeugen menschlicher Sprache gesetzt. Jetzt wird das gleiche Prinzip auf den Computer-Vision-Bereich angewendet. Eine neuere Entwicklung im Bereich Computer Vision ist Vision Transformatoren oder ViTs. Wie im Artikel „An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale“ ausführlich beschrieben wird, ViTs und transformatorbasierte Modelle sollen Faltungsmodelle ersetzen neuronale Netze (CNNs). Vision Transformers sind eine neue Herangehensweise an die Lösung von Computerproblemen Vision. Anstatt sich auf traditionelle Faltungs-Neuronale Netze zu verlassen (CNNs), die seit Jahrzehnten das Rückgrat bildbezogener Aufgaben bilden, ViTs verwenden die Transformer-Architektur zur Verarbeitung von Bildern. Sie behandeln Bildfelder wie Wörter in einem Satz, sodass das Modell das lernen kann Beziehungen zwischen diesen Patches, so wie es den Kontext in einem lernt Textabschnitt.
Im Gegensatz zu CNNs unterteilen ViTs eingegebene Bilder in Patches und serialisieren sie in Vektoren umwandeln und ihre Dimensionalität mithilfe einer Matrix reduzieren Multiplikation. Ein Transformator-Encoder verarbeitet diese Vektoren dann als Token-Einbettungen. In diesem Artikel befassen wir uns mit Vision Transformern und ihre Hauptunterschiede zu Faltungs-Neuronalen Netzen. Was macht Besonders interessant ist für sie ihre Fähigkeit, Globales zu verstehen Muster in einem Bild, mit denen CNNs möglicherweise zu kämpfen haben.
Vision-Transformatoren verwenden das Konzept der Aufmerksamkeit und der Transformatoren dazu Prozessbilder – dies ähnelt Transformatoren in einer natürlichen Sprache Verarbeitungskontext (NLP). Anstatt jedoch Token zu verwenden, wird das Bild verwendet in Patches aufgeteilt und als Folge linear eingebetteter Elemente bereitgestellt. Diese Patches werden genauso behandelt wie Token oder Wörter im NLP.
Anstatt das Gesamtbild gleichzeitig zu betrachten, schneidet ein ViT Zerlegen Sie das Bild wie ein Puzzle in kleine Teile. Jedes Stück wird gedreht in eine Liste von Zahlen (einen Vektor), die seine Merkmale beschreibt, und dann Das Modell schaut sich alle Teile an und findet heraus, in welcher Beziehung sie zueinander stehen einander mithilfe eines Transformationsmechanismus.
Im Gegensatz zu CNNs funktioniert ViTs durch die Anwendung spezifischer Filter oder Kernel
ein Bild, um bestimmte Merkmale wie Kantenmuster zu erkennen. Das ist das
Faltungsprozess, der dem Scannen eines Druckers sehr ähnlich ist
Bild. Diese Filter gleiten durch das gesamte Bild und markieren es
wesentliche Merkmale. Das Netzwerk stapelt dann mehrere Schichten
Diese Filter identifizieren nach und nach komplexere Muster.
Bei CNNs reduzieren die Pooling-Layer die Größe der Feature-Maps. Diese
Ebenen analysieren die extrahierten Features, um nützliche Vorhersagen zu treffen
Bilderkennung, Objekterkennung usw. CNNs haben jedoch eine feste Funktion
Empfangsfeld, wodurch die Fähigkeit zur Modellierung über große Entfernungen eingeschränkt wird
Abhängigkeiten.
Wie sieht CNN Bilder?
ViTs verwenden, obwohl sie mehr Parameter haben, Selbstaufmerksamkeitsmechanismen für eine bessere Feature-Darstellung und reduziert den Bedarf an tieferen Schichten. CNNs erfordern eine deutlich tiefere Architektur, um etwas Ähnliches zu erreichen Darstellungskraft, was zu erhöhten Rechenkosten führt.
Darüber hinaus können CNNs keine Bildmuster auf globaler Ebene erfassen, weil Ihre Filter konzentrieren sich auf lokale Bereiche eines Bildes. Um das zu verstehen Egal, ob es sich um das gesamte Bild oder entfernte Beziehungen handelt, CNNs basieren auf der Stapelung vieler Ebenen und Bündelung, wodurch das Sichtfeld erweitert wird. Dieser Prozess kann jedoch verlieren globale Informationen, da Details Schritt für Schritt aggregiert werden.
ViTs hingegen unterteilen das Bild in Patches, die vorhanden sind werden als einzelne Eingabe-Tokens behandelt. Mithilfe der Selbstaufmerksamkeit vergleichen ViTs Sehen Sie sich alle Patches gleichzeitig an und erfahren Sie, wie sie zusammenhängen. Dies ermöglicht es ihnen um Muster und Abhängigkeiten im gesamten Bild ohne zu erfassen Bauen Sie sie Schicht für Schicht auf.
Bevor wir fortfahren, ist es wichtig, das Konzept der induktiven Vorspannung zu verstehen. Induktive Verzerrung bezieht sich auf die Annahme, die ein Modell über Daten macht Struktur; Während des Trainings trägt dies dazu bei, dass das Modell allgemeiner wird und Voreingenommenheit reduzieren. In CNNs umfassen induktive Verzerrungen Folgendes:
Diese Verzerrungen machen CNNs, wie sie sind, für Bildaufgaben äußerst effizient von Natur aus darauf ausgelegt, die Räumlichkeit und Struktur von Bildern auszunutzen Eigenschaften.
Vision Transformers (ViTs) haben deutlich weniger bildspezifische induktive Vorspannung als CNNs. In ViTs:
Vision Transformers verwendet die Standard-Transformer-Architektur Entwickelt für 1D-Textsequenzen. Zur Verarbeitung der 2D-Bilder sind sie geeignet unterteilt in kleinere Patches fester Größe, z. B. P P-Pixel, die werden zu Vektoren abgeflacht. Wenn das Bild die Abmessungen H B mit C hat Kanäle beträgt die Gesamtzahl der Patches N = H W / P P effektiv Eingabesequenzlänge für den Transformer. Diese abgeflachten Stellen sind dann linear in einen festdimensionalen Raum D projiziert, sogenannte Patch-Einbettungen.
Ein spezieller lernbarer Token, ähnlich dem [CLS]-Token in BERT, ist wird der Reihenfolge der Patch-Einbettungen vorangestellt. Dieser Token lernt a globale Bilddarstellung, die später zur Klassifizierung verwendet wird. Zusätzlich werden den Patch-Einbettungen Positionseinbettungen hinzugefügt Codieren Sie Positionsinformationen und helfen Sie dem Modell, die Räumlichkeit zu verstehen Struktur des Bildes.
Die Einbettungssequenz wird durch den Transformer-Encoder geleitet, der zwischen zwei Hauptoperationen wechselt: Multi-Headed Self-Attention (MSA) und einem Feedforward-Neuronalen Netzwerk, auch MLP-Block genannt. Jede Schicht beinhaltet Layer Normalization (LN) angewendet, bevor diese Operationen und Restverbindungen hinzugefügt wurden anschließend, um das Training zu stabilisieren. Der Ausgang des Transformer-Encoders, Als Bild wird insbesondere der Status des [CLS]-Tokens verwendet Darstellung.
Zur Klassifizierung wird dem endgültigen [CLS]-Token ein einfacher Kopf hinzugefügt Aufgaben. Während des Vortrainings ist dieser Kopf ein kleines mehrschichtiges Perzeptron (MLP), während es sich bei der Feinabstimmung typischerweise um eine einzelne lineare Schicht handelt. Das Architektur ermöglicht es ViTs, globale Beziehungen effektiv zu modellieren zwischen den Patches und nutzen Sie die volle Kraft der Selbstaufmerksamkeit für Ihr Image Verständnis.
In einem hybriden Vision Transformer-Modell, anstatt direkt zu teilen Rohbilder werden in Patches umgewandelt, die Eingabesequenz wird aus Feature-Maps abgeleitet generiert von einem CNN. Das CNN verarbeitet das Bild zunächst und extrahiert es sinnvolle räumliche Merkmale, die dann zur Erstellung von Patches verwendet werden. Diese Patches werden abgeflacht und in einen festdimensionalen Raum projiziert unter Verwendung der gleichen trainierbaren linearen Projektion wie in Standard Vision Transformatoren. Ein Sonderfall dieses Ansatzes ist die Verwendung von Größenfeldern 1×1, wobei jeder Patch einem einzelnen räumlichen Ort im entspricht Die Feature-Map von CNN.
In diesem Fall sind die räumlichen Dimensionen der Feature-Map abgeflacht und die resultierende Sequenz wird in die projiziert Eingangsdimension des Transformators. Wie beim Standard-ViT, a Zur Beibehaltung werden Klassifizierungstoken und Positionseinbettungen hinzugefügt Positionsinformationen zu erfassen und ein globales Bildverständnis zu ermöglichen. Das Der hybride Ansatz nutzt die Stärken der lokalen Merkmalsextraktion von CNNs und kombinieren sie gleichzeitig mit den globalen Modellierungsfunktionen von Transformers.
Hier ist der Codeblock zur Verwendung der Vision Transformers Bilder.
# 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 Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen to perform predictions url = 'link to your Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen' Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224') inputs = processor(Vision Transformers (ViTs): Computer Vision mit Transformer-Modellens=Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen, return_tensors="pt").to(device) pixel_values = inputs.pixel_values # print(pixel_values.shape)
Die Das ViT-Modell verarbeitet das Bild. Es besteht aus einem BERT-ähnlichen Encoder und einem Der lineare Klassifizierungskopf befindet sich oben auf dem endgültigen verborgenen Zustand das [CLS]-Token.
with torch.no_grad(): outputs = model(pixel_values) logits = outputs.logits# logits.shapeprediction = logits.argmax(-1) print("Predicted class:", model.config.id2label[prediction.item()])
Hier ist eine grundlegende Vision Transformer (ViT)-Implementierung mit PyTorch. Das Der Code umfasst die Kernkomponenten: Patch-Einbettung, Positionskodierung, und der Transformer-Encoder. Dieser kann zur einfachen Klassifizierung verwendet werden Aufgaben.
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 Vision Transformers (ViTs): Computer Vision mit Transformer-Modellens, 3 channels, 224x224 size preds = model(dummy_img) print(preds.shape) # Output: [8, 10] (Batch size, Number of classes)
Das obige ist der detaillierte Inhalt vonVision Transformers (ViTs): Computer Vision mit Transformer-Modellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!