Zu diesem Zeitpunkt wurden alle ViT-Komponenten erfolgreich erstellt. Daher können wir sie jetzt verwenden, um die gesamte Vision Transformer-Architektur zu konstruieren. Die Klasse ViT in Codeblock 17 zeigt, wie dies gemacht wird. Es gibt einige wichtige Punkte, die ich hier hervorheben möchte. Zunächst verwenden wir an der Stelle #(1) entweder PatcherUnfold() oder PatcherConv(), da beide die gleiche Rolle haben, nämlich den Patch-Flattening- und linearen Projektionsschritt durchzuführen. In diesem Fall wird Letzteres ohne spezifischen Grund verwendet. Zweitens wird der Transformer Encoder-Block NUM_ENCODER (12) Mal wiederholt (#(2)), da wir ViT-Base gemäß Abbildung 3 implementieren. Vergessen Sie schließlich nicht, den Tensor, der vom Transformer Encoder ausgegeben wird, zu schneiden, da unser MLP-Head nur den Klassentoken-Teil des Ausgabesatzes verarbeiten wird (#(3)).
Um zu überprüfen, ob unser ViT-Modell ordnungsgemäß funktioniert, können wir den folgenden Code verwenden. Codeblock 18 zeigt dies. Das Ergebnis ist ein Tensor der Größe 1×10, was darauf hinweist, dass unser Modell wie erwartet funktioniert. Zusätzlich können wir die detaillierte Struktur des Netzwerks mithilfe der Funktion summary() überprüfen, die am Anfang des Codes importiert wurde. Der Gesamtbetrag der Parameter beträgt ungefähr 86 Millionen, was mit der in Abbildung 3 angegebenen Zahl übereinstimmt (Codeblock 19).
Es ist wichtig zu beachten, dass die Ausgabe des Codeblocks 18 für eine bessere Klarheit der Darstellung aller Druckausgaben auskommentiert werden sollte. Der Codeblock 19 zeigt die Struktur des Netzwerks detailliert an. Es wird deutlich, dass die Gesamtanzahl der Parameter bei ungefähr 86 Millionen liegt, was erwartungsgemäß mit den Spezifikationen übereinstimmt. Die Struktur umfasst mehrere Schichten wie PatcherConv, PosEmbedding, Sequential, TransformerEncoder, MultiheadAttention und MLPHead, die alle Teil der ViT-Architektur sind.
Hinterlasse eine Antwort