Un’immersione approfondita nel codice del modello Visual Transformer (ViT)

Un'immersione nel codice del modello Visual Transformer (ViT)

Scomposizione dell’implementazione di HuggingFace ViT

Vision Transformer (ViT) rappresenta una pietra miliare nel campo della visione artificiale. ViT sfida la saggezza convenzionale secondo cui le immagini vengono elaborate al meglio attraverso strati convoluzionali, dimostrando che i meccanismi di attenzione basati su sequenze possono catturare efficacemente i pattern intricati, il contesto e la semantica presenti nelle immagini. Scomponendo le immagini in patch gestibili e sfruttando l’auto-attenzione, ViT cattura le relazioni locali e globali, consentendo di eccellere in diverse attività di visione, dalla classificazione delle immagini al rilevamento degli oggetti e oltre. In questo articolo, analizzeremo come funziona ViT per la classificazione.

https://unsplash.com/photos/aVvZJC0ynBQ

Introduzione

L’idea principale di ViT è trattare un’immagine come una sequenza di patch di dimensione fissa, che vengono quindi appiattite e convertite in vettori 1D. Queste patch sono successivamente elaborate da un codificatore transformer, che consente al modello di catturare il contesto globale e le dipendenze sull’intera immagine. Suddividendo l’immagine in patch, ViT riduce efficacemente la complessità computazionale nell’elaborazione di immagini di grandi dimensioni mantenendo la capacità di modellare interazioni spaziali complesse.

Per prima cosa, importiamo il modello ViT per la classificazione dalla libreria hugging face transformers:

from transformers import ViTForImageClassificationimport torchimport numpy as npmodel = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")

patch16-224 indica che il modello accetta immagini di dimensione 224×224 e ogni patch ha larghezza e altezza di 16 pixel.

Ecco a cosa assomiglia l’architettura del modello:

ViTForImageClassification(  (vit): ViTModel(    (embeddings): ViTEmbeddings(      (patch_embeddings): PatchEmbeddings(        (projection): Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16))      )      (dropout): Dropout(p=0.0, inplace=False)    )    (encoder): ViTEncoder(      (layer): ModuleList(        (0): ViTLayer(          (attention): ViTAttention(            (attention): ViTSelfAttention(              (query): Linear(in_features=768, out_features=768, bias=True)              (key)…