Görsel Transformerlar (ViT) Eğitimi: Mimari ve Kod Örnekleri
Görsel Transformerların (ViT) yama gömmeleri ve öz-dikkati kullanarak modern görüntü sınıflandırmada CNN’leri nasıl geride bıraktığını öğrenin. Bu derinlemesine eğitim, ViT mimarisini adım adım açıklar, adım adım Python kodu sunar ve gerçek dünyadaki bilgisayarlı görü projelerinde ViT’leri ne zaman seçeceğinizi gösterir.
Hepimiz Transformerların doğal dil işlemede temel hale geldiğini ve artık bilgisayarlı görü alanında da ivme kazandığını biliyoruz. Görsel Transformerlar (ViT), metin tabanlı modellerde kullanılan aynı ilkeleri kullanarak görüntü anlama konusunda yeni bir yaklaşım sunar; Büyük Dil Modelleri.
ViT’ler ilk olarak 2020’de Google Research tarafından “An Image is Worth 16×16 Words” adlı makaleyle tanıtıldı ve büyük görüntü veri setlerinde eğitilen transformerların CNN’lerle başa baş gidebildiğini veya onları geçebildiğini gösterdi. O zamandan beri, DeiT ve Swin gibi pratik varyantlar birçok görsel görevde kullanımını genişletti.
Bu eğitimde, görsel transformerların (klasik/orijinal varyant) temel kavramları, mimari bileşenleri ve pratik uygulamaları boyunca size rehberlik edeceğim. Sonunda, ViT’lerin nasıl çalıştığını sadece anlamakla kalmayacak, onları kendi bilgisayarlı görü projelerimize nasıl uygulayacağımızı da öğreneceğiz. Ayrıca çoklu başlık dikkati hakkındaki diğer rehberime de bakmanızı öneririm.
Görsel Transformer (ViT) nedir?
Görsel transformerları yumuşak bir girişle tanıtarak başlayalım.
Bu modeller, bir görüntüyü verilerin bir dizisi olarak ele alır; tıpkı bir dil modelinin bir cümledeki sözcükleri işlemesi gibi. Ardından görüntü sabit boyutlu yamalara bölünür; her yama düzleştirilir ve bir vektöre gömülür.
Bu vektörler daha sonra standart bir transformer kodlayıcıdan geçirilir; bu kodlayıcı, dikkat mekanizmasıyla yama ilişkilerini küresel ölçekte modeller.
Evrimsel sinir ağlarıyla karşılaştırma
Bu, temel olarak evrişimli sinir ağlarından (CNN) farklıdır; CNN’ler yerel özelliklere odaklanır ve hiyerarşik özellik çıkarımına dayanır.
Madem CNN’lerden bahsediyoruz, gelin aralarındaki farkların neler olduğuna bakalım:
Özellik
Evrişimli Sinir Ağları (CNN)
Görsel Transformerlar (ViT)
Mimari
Evrişim + Havuzlama Katmanları kullanır
Öz-Dikkatli Transformer Kodlayıcı kullanır
Alıcı Alan
Yereldir, derinlikle genişler
Başlangıçtan itibaren küreseldir
Konumsal Farkındalık
Yapı yoluyla örtük
Konumsal kodlamalarla açık
Veri Gereksinimi
Küçük veri setleriyle de oldukça etkilidir
Büyük ölçekli veri setleri gerektirir
Çıkarımsal Önyargı
Güçlü
Asgari fakat daha esnek
Paralellik Potansiyeli
Orta
Çok Yüksek
Model Ölçekleme
Büyük modellere daha az ölçeklenebilir
Oldukça ölçeklenebilir
Yorumlanabilirlik
Havuzlama katmanları üzerinden ama yine de zordur.
Dikkat görselleştirmeyle artırılabilir, ancak bu da oldukça zordur
Elbette görsel transformerları henüz tam derinliğiyle ele almadık, ancak baştan her zaman mantıklı gelmeyebilecek bazı noktaları gözden geçirmek faydalı.
Örneğin, çıkarımsal önyargı ve alıcı alanlar daha önce duymamış olabileceğiniz ama önemli kavramlardır.
Çıkarımsal önyargı açıklaması
Çıkarımsal önyargı, bir modelin veriden öğrenmesine yardımcı olmak için yaptığı varsayımlar demektir. Kulağa kafa karıştırıcı gelebilir ama şu benzetmeyi okuyunca anlamlı olacaktır.
Birlikte bir yapboz yaptığımızı hayal edin. Parçaların şekil ve renge göre birleşeceğini düşünebiliriz. Bu varsayım, parçaları daha hızlı yerleştirmemize yardım eder. CNN modeli böyle çalışır.
Görüntüde birbirine yakın kısımların ilişkili olduğunu varsayarak akıllı tahminler yapar; tıpkı birbirine yakın yapboz parçalarının genellikle resmin aynı bölümüne ait olması gibi. Ayrıca bir şekli yerini değiştirsek de hâlâ aynı şekil olduğunu varsayar. Bu yardımcı varsayımlar güçlü çıkarımsal önyargılar olarak adlandırılır.
Şimdi elimizde büyük bir yapboz parçası yığını olduğunu, ancak son resmin neye benzediği hakkında hiçbir fikrimiz olmadığını hayal edin. Şekle mi renge mi yoksa bambaşka bir şeye mi bakmamız gerektiğini bile bilmiyoruz. Bu yüzden her şeyi denemeye başlar ve yavaş yavaş neyin işe yaradığını keşfederiz.
Bir Transformer modeli de bunu yapar. Güçlü varsayımlar yapmaz. Kalıpları çok miktarda veriye bakarak öğrenir. Buna asgari çıkarımsal önyargı denir. Modele daha fazla özgürlük verir ama daha çok veri ve zaman gerektirir.
Alıcı alan açıklaması
Yukarıdaki görsel, bir CNN modelinin alıcı alanının nasıl değiştiğini gösteriyor. Unutmayın, bir CNN’de birden fazla evrişim katmanı vardır; ağın derinliklerine indikçe her katmandaki nöron, girdinin giderek daha büyük bir bölgesinden etkilenir.
Bu genişleyen alıcı alan, daha derin katmanların daha karmaşık ve küresel özellikleri tespit etmesini sağlar; yukarıdaki şekilde gösterildiği gibi (kulaktan yüze, oradan tüm köpeğe).
Bu, bir Görsel Transformer’ın alıcı alanından oldukça farklıdır:
Yukarıdaki çizimde, (klasik) bir ViT’de alıcı alanın küresel olduğunu, dolayısıyla tüm yamaların birbirine farklı büyüklüklerde dikkat ettiğini (okların kalınlığıyla gösterilmiştir) görebiliriz.
Basitlik açısından, yeşil renkle gösterilen yamanın diğer yamalar tarafından dikkat edildiğini gösterdim; ancak gerçekte tüm yamalar birbirine dikkat eder (çizmesi fazla karmaşık olurdu!)
CNN’leri ne zaman, görsel transformerları ne zaman kullanmalı?
Bir CNN ile görsel transformerı ne zaman kullanacağımızı anlamak, bilgisayarlı görü iş akışlarımızda etkili mimari seçimler yapmak için oldukça önemlidir.
Her iki modelin de güçlü (ve zayıf!) yönleri vardır; ancak performansları, veri boyutu, hesaplama kaynakları ve modellemeye çalıştığımız görsel kalıpların karmaşıklığına bağlı olarak farklı koşullarda daha iyidir.
Aralarında seçim yaparken şu noktalara bakmayı seviyorum:
CNN’leri şu durumlarda kullanmalısınız:
Sınırlı verilerle çalışırken - CNN’lerin yerellik gibi güçlü çıkarımsal önyargılarla geldiğini ve bunun da küçük veri setleriyle bile iyi genelleme yapmalarına yardımcı olduğunu belirtmiştik. Bu, büyük miktarda etiketli veri toplamanın pratik olmadığı görevler için onları güvenilir bir seçenek kılar.
Gerçek zamanlı performans önemli olduğunda - CNN’ler genellikle daha düşük çıkarım gecikmesine sahiptir ve özellikle mobil ve uç cihazlarda standart donanımda hesaplama açısından daha verimlidir. Mimarileri, daha az parametre ve daha az bellek kullanımıyla performans için optimize edilmiştir.
Hesaplama bütçesi sınırlı olduğunda - Sıfırdan bir CNN eğitmek veya önceden eğitilmiş olanı ince ayarlamak, ViT’lere kıyasla önemli ölçüde daha az kaynak gerektirir. Tek bir GPU ve makul bellekle iyi bir CNN eğitebiliriz; bu, transformer tabanlı modeller için her zaman geçerli değildir.
Görsel Transformerları şu durumlarda kullanmalısınız:
Geniş ölçekli etiketli veri setlerine ve güçlü hesaplama altyapısına erişim olduğunda - Karşılaştırma tablosunda belirttiğim gibi, görsel transformerlar veri açtır ve özellikle klasik biçimlerinde ciddi eğitim süresi ve bellek gerektirir. Yeterli veri ve hesaplama gücüyle birçok ölçüt testinde CNN’leri geride bırakabilirler.
Uzun menzilli mekânsal ilişkileri yakalamamız gerektiğinde - CNN’lerin yerel işlediğinin aksine (alıcı alan bölümünü hatırlayın), ViT’ler öz-dikkati kullanarak tüm görüntü yamaları arasındaki ilişkileri modelleyerek, tüm görüntü boyunca mekânsal bağlamın önemli olduğu görevlerde özellikle faydalıdır.
Önceden eğitilmiş modeller ve transfer öğrenme kullanmak istediğimizde - Önceden eğitilmiş ViT’lere (örneğin HuggingFace veya timm üzerinden) erişebiliriz; bu nedenle ince ayar çok daha pratik hale gelir. Bu durumda, sıfırdan eğitim olmadan orta boyutlu veri setleriyle bile harika sonuçlar elde edebiliriz.
Özetle, kendinizi bir düşük kaynaklı ortamda bulursanız veya kısıtlı veriyle hızlı ve güvenilir sonuçlara ihtiyacınız varsa, CNN’ler daha güvenli ve daha verimli bir seçenektir.
Öte yandan, projeniz görsel uzayda derin küresel akıl yürütme gerektiriyorsa ve bunu destekleyecek hesaplama gücünüz varsa, görsel transformerlar daha iyi bir seçenektir.
Bir Görsel Transformerin Bileşenleri
Şimdi Görsel Transformerin gerçek mimarisine dalalım. Birden fazla aşama (özellikle beş) olduğundan, gelin bunları tek tek inceleyelim.
Aşama 1: Görüntüyü yamalama
Bu, bir görüntüyü transformerin anlayabileceği bir forma dönüştürmemiz gereken ilk dönüşüm adımıdır.
224x224 bir görüntümüz olduğunu varsayalım. Tümünü beslemek yerine, onu daha küçük, sabit boyutlu yamalara böleriz. Her yama 16x16 ise (orijinal makalede önerildiği gibi), görüntü 14×14 = 196 yamaya bölünür; çünkü (224/16 =14).
Bunu anlamanın çok kolay bir yolu, bir fotoğrafı kusursuz eşit kare döşemelere kesmeyi düşünmektir. Her yama yerelleştirilmiş bilgi içerir ve bir cümledeki bir "kelime" gibi davranır.
Yukarıdaki çizimde, bir kurdun görüntüsünün daha küçük kare (ve eşit) parçalara — tam olarak 196’ya — bölündüğünü görebilirsiniz.
Yine de burada bir sorunuz olabilir:
“Görüntü RGB, peki 3 renk kanalı ne oluyor?”
Bu önemli bir noktadır; her yama aslında bir veri bloğudur ve bizim örneğimizde 16x16x3 biçimine sahiptir. 16x16 yükseklik ve genişliktir; 3 ise renk kanallarıdır; böylece her yama 3 boyutlu bir tensördür.
Bu da her yamayı, görüntünün yerel bir bölgesinden hem mekânsal hem de renk bilgisinin kompakt bir temsili yapar.
Yamalara bu bölünme, görüntünün 2B mekânsal yapısını bir 1B diziye dönüştürür; bu çok boyutlu veri dizisi, bir transformer modeli için uygundur.
Aşama 2: Yama gömme (embedding)
Sırada, her görüntü yamasını transformerin kullanabileceği sayısal bir temsile dönüştürmemiz gerekiyor.
Her 16x16 RGB yama bir vektöre düzleştirilir. Örneğimizde 16×16×3 = 768 değer. Esasen tüm piksel ve renk değerlerini tek bir sayı satırına açıyoruz.
Bu ham vektörler bilgilendirici olsa da, henüz öğrenmeye uygun bir uzayda değildir. Bu yüzden her birini bir eğitilebilir doğrusal izdüşüm katmanından geçiririz. Bunu, her 768 boyutlu girdiyi D (çoğunlukla yine 768, ama her zaman değil) boyutunda yeni bir gömme uzayına eşleyen yoğun bir katman olarak düşünebilirsiniz.
Neden?
Bu izdüşüm önemlidir; çünkü tüm yama belirteçlerini, transformer kodlayıcının beklediği tutarlı ve öğrenilebilir bir biçime hizalar. Bu noktaya kadar, her vektörün görüntünün bir yamasını temsil ettiği sabit uzunluklu vektörlerden oluşan bir dizimiz vardı.
Bu sürecin tamamı, mekânsal ve renk açısından zengin yamaları, transformerin görüntüyü NLP’deki kelime gömmelerine benzer şekilde bir öğrenilebilir varlıklar dizisi olarak ele almasına olanak tanıyan birleşik bir "belirteç" dizisine dönüştürür.
Aşama 3: Konumsal kodlama
Bu belirteçleri kodlayıcımıza göndermeden önce bir şey kaldı. Daha önce LLM’leri öğrendiyseniz bunu tahmin etmiş olabilirsiniz!
Transformerlar doğası gereği konumdan bağımsızdır.
Bu, girdi dizilerini sırasız koleksiyonlar olarak ele aldıkları, yani belirteçlerin sırasını veya konumunu anlamak için yerleşik bir mekanizmaya sahip olmadıkları anlamına gelir. Bu ise görüntü analizinde büyük bir sorundur; çünkü hem mekânsal yapı hem de yerleşim kritiktir!
Bunu ayrıntılı olarak konuşalım.
Görüntüler bağlamında, her yama orijinal görüntünün belirli bir bölgesini temsil eder. Modeli, her yamanın nereden geldiğini belirtmeden yama gömmelerinin bir dizisiyle beslersek, bir yamanın sol üst köşeden mi yoksa sağ alttan mı geldiğine dair hiçbir fikri olmaz.
Bu mekânsal farkındalık eksikliği, modelimizin desenleri, şekilleri, yapıları vb. anlamasını sınırlar.
Bunu çözmek için her yama gömmesine konumsal kodlama ekleriz. Bu, mekânsal bir etiket gibi davranan bir vektördür; yamanın görüntü içindeki orijinal konumunu kodlayan bir vektör. Bu konumsal vektörler, dizi transformere girmeden önce doğrudan yama gömmelerine eklenir.
İki yaygın konumsal kodlama türü vardır:
Sabit (sinüzoidal) konumsal kodlama: Konum bilgisini kodlamak için farklı frekanslarda sinüs ve kosinüs fonksiyonları kullanır. Deterministiktir ve öğrenmeyi gerektirmez. Ünlü “Attention is all you need” makalesinde de bu kullanılmıştır.
Öğrenilmiş konumsal kodlama: Bunlar, modelin eğitim sırasında öğrendiği eğitilebilir parametrelerdir. Dizideki her konum kendi öğrenilebilir vektörünü alır.
Bu noktada kafanız karıştıysa, bunu kavramanın kolay bir yolu konumsal kodlamaları yamalar için GPS koordinatları olarak düşünmektir.
Transformere belirtecin orijinal konumunu söylerler. Bu bilgiyi dahil ederek, öz-dikkat mekanizmasının her yamanın içeriğini ve görüntü içindeki göreli veya mutlak konumunu modellemesine izin veririz.
Bu adım çok kritiktir — olmadan, Görsel Transformer dikkat mekanizması ne kadar güçlü olursa olsun bir görüntünün yapısını yeniden kuramazdı.
Aşama 4: Transformer kodlayıcı bloğu
Şimdi tüm derin öğrenmenin gerçekleştiği noktaya geldik — desen keşfi, bağlam modelleme ve özellik füzyonu.
Tam Görsel Transformer Kodlayıcıyı oluşturmak için bu Kodlayıcı bloklarından birkaçı üst üste yığılır. Her kodlayıcı bloğunun neler içerdiğine bakalım:
Çoklu başlık öz-dikkat (MHSA): Bu mekanizma, her yamanın her başka yamayla etkileşime girmesine izin verir. Modelin, görüntünün hangi kısımlarının birbirleriyle en ilgili olduğunu belirlemesine yardımcı olur.
Bir yamaya yalıtık bakmak yerine, MHSA ona küresel bir bağlam verir.
Birden çok dikkat başlığı ilişkilerin farklı yönlerine bakar ve bu da görüntünün daha zengin bir yorumunu sağlar.
İleri beslemeli sinir ağı (FFN): Bu, dikkat sonrasında her belirteci bağımsız olarak işleyen küçük bir Çok Katmanlı Algılayıcıdır. Bunu yapmamızın nedeni, modelin karmaşık, doğrusal olmayan kalıpları öğrenme yeteneğini geliştirmektir.
Artık bağlantılar ve katman normu: Bunlar eğitimi dengeler ve gradyanların ağ boyunca daha iyi akmasına yardımcı olur.
Genel olarak, bu kodlayıcı blokları katmanlar halinde (ör. ViT-Base’de 12) yığılır ve her katmanda daha derin görüntü temsilleri öğrenilir.
Aşama 5: Sınıflandırma belirteci ve MLP başı
Neredeyse geldik! Şimdi (klasik) ViT’nin son ve nihai aşamasına geçelim.
Tüm kodlayıcı katmanlarından sonra, her şeyi özetlemenin ve bir tahmin yapmanın bir yoluna ihtiyacımız var.
Bu yüzden yama dizisinin başına özel bir [CLS] belirteci ekleriz. Bu, kodlama sırasında diğer tüm belirteçlerle etkileşime giren öğrenilebilir bir gömmedir.
Transformer katmanları boyunca ilerlerken küresel bilgi toplar. Sonunda bu belirteci çıkarır ve başka bir çok katmanlı algılayıcı (MLP) başından geçiririz; bu genellikle birkaç yoğun katmanın ardından (sınıflandırma için) bir softmax’tır.
Bu son adım bize tahmin edilen etiketi verir; örneğin, [CLS] belirteci tarafından toplanan bilgilere dayanarak “bu görüntü bir köpek” demek gibi. Şunu not etmek çok önemlidir: Son MLP Başına yalnızca [CLS belirteci] gönderilir ve bu nedenle sınıflandırmada o kullanılır; diğer belirteçler değil!
Dikkate Değer Görsel Transformer Mimarileri
Şimdi devrim niteliğindeki bazı Görsel Transformer mimarilerine bakalım.
ViT (Google Brain) - Bu, görüntü sınıflandırma için ImageNet-21k gibi büyük veri setlerini kullanarak yama tabanlı transformer modelini tanıtan (ve bu yazı boyunca takip ettiğimiz) orijinal görsel transformerdır.
DeiT (Veri-verimli Görsel Transformer) - Facebook AI tarafından tanıtılan DeiT, bilgi damıtma tekniklerini dahil ederek veri verimliliğini artırır ve daha küçük veri setlerinde eğitimi mümkün kılar.
Swin Transformer - Hiyerarşik mimari ve kaydırılmış pencereler kullanarak, doğruluğu korurken hesaplamayı azaltır. Özellikle nesne tespiti gibi yoğun tahmin görevlerinde etkilidir.
Diğer Varyantlar - BEiT, CvT ve MobileViT gibi modeller; eğitim verimliliğini, model sıkılığını veya çıkarım hızını artırmak için çeşitli tasarım iyileştirmeleri içerir.
Önceden Eğitilmiş Görsel Transformerları Kullanma
Çoğu zaman bir ViT’yi sıfırdan eğitmeyeceğiz! Bu yüzden popüler derin öğrenme kütüphanelerinden önceden eğitilmiş ViT modellerini nasıl kullanabileceğimizi keşfedelim.
HuggingFace transformers kütüphanesi
Görsel transformerları kullanmanın en kolay ve en güvenilir yollarından biri Hugging Face Transformers kütüphanesidir. Sadece birkaç satır kodla kullanıma hazır önceden eğitilmiş ViT modelleri sunar.
Orijinal ViT Base modelini indirmek ve kullanmak için burada biraz kod yazdım:
# Imports neededfrom transformers import ViTImageProcessor, ViTForImageClassificationfrom PIL import Imageimport torchimport requests# Here I am loading and preprocessing an image - but you can use any image of your choiceimage = Image.open(requests.get(https://huggingface.co/datasets/huggingface/cats-image?image-viewer=ED6CB286C90CF5F1FAF278077DF091477DF05416', stream=True).raw)# Here, we load and process the ViT modelprocessor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')# Preprocessing the image so it gets it into the necessary formatinputs = processor(images=image, return_tensors='pt')# Forward pass - with no backpropagationwith torch.no_grad(): outputs = model(**inputs)# Here we get the predicted labels (since we are performing classification)logits = outputs.logits predicted_class = logits.argmax(-1) # Selects the index of the class with the highest logit score (highest predicted probability)print(f("Predicted class index: {predicted_class.item()}")Altyapı:
Bu kodu biraz daha derinlemesine konuşalım. Öncelikle, iki ayrı bileşen indirmeniz gerektiği konusunda bir sorunuz olabilir. Bunlar ayrı olmakla birlikte birbirini tamamlar:
ViTImageProcessor – Görüntü, modele aktarılmadan önce ön işlemeden sorumludur. Yeniden boyutlandırmayı, normalleştirmeyi ve görüntüyü görsel transformerin beklediği biçime dönüştürmeyi yönetir. Bunu, NLP’de belirteçleyicinin (tokenizer) görsel karşılığı olarak düşünebilirsiniz!
ViTForImageClassification – Bu, çıkarımı gerçekleştiren asıl modeldir. Belirli bir tensör biçiminde girdiler bekler ve (ör. logitler veya sınıf olasılıkları) tahminler üretir.
Bir diğer şüphe de output.logits hakkında olabilir; daha spesifik olarak logitlerin ne olduğu hakkında.
Makine öğrenmesi modellerinde — özellikle sınıflandırma modellerinde — logitler, modelin son katmanı tarafından herhangi bir softmax gibi aktivasyon fonksiyonu uygulanmadan önce üretilen ham çıktı değerleridir. Her sınıf için normalleştirilmemiş puanları temsil ederler.
Bunları, modelin her sınıf için iç güven düzeyleri olarak düşünebilirsiniz. Bu değerler pozitif veya negatif olabilir ve toplamları bire eşit olmak zorunda değildir.
Logitleri olasılıklara dönüştürmek için, değerleri bir olasılık dağılımına ölçekleyen softmax fonksiyonunu uygulamamız gerekir.
Dolayısıyla argmax(logits, -1) kullandığımızda, basitçe en yüksek ham skora sahip olan sınıfın (softmax sonrası en yüksek olasılığa karşılık gelen) indeksini seçeriz.
timm kütüphanesini kullanma
Görsel transformerları kullanmak için bir diğer harika ve ünlü kütüphane timm’dir (Ross Wightman tarafından). Birçok önceden eğitilmiş ViT varyantı sunar ve hızlı denemeler veya ince ayar için uygundur. Bir ViT modelini çıkarım için nasıl yükleyip kullanabileceğimiz şöyledir:
# Relevant importsimport timmimport torchfrom torchvision import transformsfrom PIL import Imageimport requests# Loading an imageurl = 'https://huggingface.co/datasets/huggingface/cats-image?image-viewer=ED6CB286C90CF5F1FAF278077DF091477DF05416'image = Image.open(requests.get(url, stream=True).raw)# Here we have defined the transformation we are going to do on the imagetransform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])])image_tensor = transform(image).unsqueeze(0) # Adding batch dimension# Loading the ViT modelmodel = timm.create_model('vit_base_patch16_224', pretrained=True)model.eval() # Setting it to evaluation mode# Inference componentwith torch.no_grad(): outputs = model(image_tensor) predicted_class = outputs.argmax(dim=1) # Obtaining the class with the highest probabilityprint(f("Predicted class index: {predicted_class.item()}")Altyapı:
Artık timm ile transformers kütüphaneleri arasındaki benzerliği görebilmelisiniz. Her ikisi de önceden eğitilmiş ViT modelleri sağlar, görüntü işlemeye olanak tanır (her ne kadar timm’de standart PyTorch kodu kullansak da) ve sonunda en yüksek logite sahip sınıfı elde ederiz.
Sonuç
Genel olarak, görsel transformerlar görüntüleri yama “cümlelerine” dönüştürerek ve ilk katmandan itibaren küresel bağlamı yakalamak için öz-dikkati kullanarak bilgisayarlı görüyü yeniden şekillendirdi. Bu eğitimde şunları öğrendik:
ViT’lerin neden CNN’lerden farklı olduğu – asgari çıkarımsal önyargı, küresel alıcı alanlar, büyük ölçeklenebilirlik vb.
Hangi modeli ne zaman seçeceğimiz – CNN’ler sınırlı veri ve sıkı gecikme bütçeleriyle öne çıkarken, ViT’ler bol veri ve güçlü donanım olduğunda daha iyidir.
Temel ViT mimarisi – Görüntü yamalamadan ve öğrenilmiş konumsal kodlamalardan çoklu başlık öz-dikkate, artık yollarına ve sınıflandırma için [CLS] belirtecine kadar tüm aşamaları ele aldık.
Pratik uygulama – Farklı kütüphanelerden (Hugging Face veya timm) önceden eğitilmiş modeller nasıl yüklenir, görüntüler nasıl ön işlenir ve tahminler nasıl çıkarılır.
Öğrenmeye devam etmek için, Transformerların nasıl çalıştığını anlatan şu makaleye göz atmanızı öneririm: Transformerlar Nasıl Çalışır; Transformerların arkasındaki teoriyi öğreneceksiniz. Bunu pekiştirmek için de sıfırdan bir transformer nasıl inşa edilir konusunu keşfetmenizi öneririm.
Görsel Transformerlar neden görüntüleri ham pikselleri okumak yerine 16 × 16 yamalara böler?⌄
Yamalamak, 2B görüntüyü 1B belirteç “cümlesine” dönüştürür; böylece transformer, dil modellerini güçlendiren aynı öz-dikkat yöntemlerini uygulayabilir.
ViT’lerin iyi çalışması için her zaman milyonlarca görüntüye ihtiyaç var mı?⌄
Her zaman değil; önceden eğitilmiş bir ViT’den başlayıp ince ayar yapabiliriz. Bunun için genelde birkaç bin etiketli görüntü güçlü sonuçlar için yeterlidir.
ViT’ler her yamanın nereden geldiğini nasıl “biliyor”?⌄
Her yama belirtecine konumsal kodlamalar ekleyerek, modele mekânsal bir sıra hissi kazandırırlar.
Ne zaman ViT yerine hâlâ bir CNN seçmeliyim?⌄
Veri azsa veya uç cihazlarda son derece hızlı ve bellek dostu çıkarıma ihtiyacımız varsa CNN’leri seçmeliyiz.
Bir ViT’nin neye odaklandığını görselleştirebilir miyim?⌄
Evet; dikkat haritalarını çıkarıp büyütebilir ve ısı haritası olarak bindirerek hangi yamaların tahmini yönlendirdiğini görebiliriz.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Llama 3 gibi LLM'ler de dahil olmak üzere üretim için en yeni yapay zeka modellerini eğitin ve ince ayar yapın. Yapay Zeka Mühendisi olma yolculuğunuza bugün başlayın!
Hepimiz Transformerların doğal dil işlemede temel hale geldiğini ve artık bilgisayarlı görü alanında da ivme kazandığını biliyoruz. Görsel Transformerlar (ViT), metin tabanlı modellerde kullanılan aynı ilkeleri kullanarak görüntü anlama konusunda yeni bir yaklaşım sunar; Büyük Dil Modelleri.
ViT’ler ilk olarak 2020’de Google Research tarafından “An Image is Worth 16×16 Words” adlı makaleyle tanıtıldı ve büyük görüntü veri setlerinde eğitilen transformerların CNN’lerle başa baş gidebildiğini veya onları geçebildiğini gösterdi. O zamandan beri, DeiT ve Swin gibi pratik varyantlar birçok görsel görevde kullanımını genişletti.
Bu eğitimde, görsel transformerların (klasik/orijinal varyant) temel kavramları, mimari bileşenleri ve pratik uygulamaları boyunca size rehberlik edeceğim. Sonunda, ViT’lerin nasıl çalıştığını sadece anlamakla kalmayacak, onları kendi bilgisayarlı görü projelerimize nasıl uygulayacağımızı da öğreneceğiz. Ayrıca çoklu başlık dikkati hakkındaki diğer rehberime de bakmanızı öneririm.
Görsel Transformer (ViT) nedir?
Görsel transformerları yumuşak bir girişle tanıtarak başlayalım.
Bu modeller, bir görüntüyü verilerin bir dizisi olarak ele alır; tıpkı bir dil modelinin bir cümledeki sözcükleri işlemesi gibi. Ardından görüntü sabit boyutlu yamalara bölünür; her yama düzleştirilir ve bir vektöre gömülür.
Bu vektörler daha sonra standart bir transformer kodlayıcıdan geçirilir; bu kodlayıcı, dikkat mekanizmasıyla yama ilişkilerini küresel ölçekte modeller.
Evrimsel sinir ağlarıyla karşılaştırma
Bu, temel olarak evrişimli sinir ağlarından (CNN) farklıdır; CNN’ler yerel özelliklere odaklanır ve hiyerarşik özellik çıkarımına dayanır.
Madem CNN’lerden bahsediyoruz, gelin aralarındaki farkların neler olduğuna bakalım:
Özellik
Evrişimli Sinir Ağları (CNN)
Görsel Transformerlar (ViT)
Mimari
Evrişim + Havuzlama Katmanları kullanır
Öz-Dikkatli Transformer Kodlayıcı kullanır
Alıcı Alan
Yereldir, derinlikle genişler
Başlangıçtan itibaren küreseldir
Konumsal Farkındalık
Yapı yoluyla örtük
Konumsal kodlamalarla açık
Veri Gereksinimi
Küçük veri setleriyle de oldukça etkilidir
Büyük ölçekli veri setleri gerektirir
Çıkarımsal Önyargı
Güçlü
Asgari fakat daha esnek
Paralellik Potansiyeli
Orta
Çok Yüksek
Model Ölçekleme
Büyük modellere daha az ölçeklenebilir
Oldukça ölçeklenebilir
Yorumlanabilirlik
Havuzlama katmanları üzerinden ama yine de zordur.
Dikkat görselleştirmeyle artırılabilir, ancak bu da oldukça zordur
Elbette görsel transformerları henüz tam derinliğiyle ele almadık, ancak baştan her zaman mantıklı gelmeyebilecek bazı noktaları gözden geçirmek faydalı.
Örneğin, çıkarımsal önyargı ve alıcı alanlar daha önce duymamış olabileceğiniz ama önemli kavramlardır.
Çıkarımsal önyargı açıklaması
Çıkarımsal önyargı, bir modelin veriden öğrenmesine yardımcı olmak için yaptığı varsayımlar demektir. Kulağa kafa karıştırıcı gelebilir ama şu benzetmeyi okuyunca anlamlı olacaktır.
Birlikte bir yapboz yaptığımızı hayal edin. Parçaların şekil ve renge göre birleşeceğini düşünebiliriz. Bu varsayım, parçaları daha hızlı yerleştirmemize yardım eder. CNN modeli böyle çalışır.
Görüntüde birbirine yakın kısımların ilişkili olduğunu varsayarak akıllı tahminler yapar; tıpkı birbirine yakın yapboz parçalarının genellikle resmin aynı bölümüne ait olması gibi. Ayrıca bir şekli yerini değiştirsek de hâlâ aynı şekil olduğunu varsayar. Bu yardımcı varsayımlar güçlü çıkarımsal önyargılar olarak adlandırılır.
Şimdi elimizde büyük bir yapboz parçası yığını olduğunu, ancak son resmin neye benzediği hakkında hiçbir fikrimiz olmadığını hayal edin. Şekle mi renge mi yoksa bambaşka bir şeye mi bakmamız gerektiğini bile bilmiyoruz. Bu yüzden her şeyi denemeye başlar ve yavaş yavaş neyin işe yaradığını keşfederiz.
Bir Transformer modeli de bunu yapar. Güçlü varsayımlar yapmaz. Kalıpları çok miktarda veriye bakarak öğrenir. Buna asgari çıkarımsal önyargı denir. Modele daha fazla özgürlük verir ama daha çok veri ve zaman gerektirir.
Alıcı alan açıklaması
Yukarıdaki görsel, bir CNN modelinin alıcı alanının nasıl değiştiğini gösteriyor. Unutmayın, bir CNN’de birden fazla evrişim katmanı vardır; ağın derinliklerine indikçe her katmandaki nöron, girdinin giderek daha büyük bir bölgesinden etkilenir.
Bu genişleyen alıcı alan, daha derin katmanların daha karmaşık ve küresel özellikleri tespit etmesini sağlar; yukarıdaki şekilde gösterildiği gibi (kulaktan yüze, oradan tüm köpeğe).
Bu, bir Görsel Transformer’ın alıcı alanından oldukça farklıdır:
Yukarıdaki çizimde, (klasik) bir ViT’de alıcı alanın küresel olduğunu, dolayısıyla tüm yamaların birbirine farklı büyüklüklerde dikkat ettiğini (okların kalınlığıyla gösterilmiştir) görebiliriz.
Basitlik açısından, yeşil renkle gösterilen yamanın diğer yamalar tarafından dikkat edildiğini gösterdim; ancak gerçekte tüm yamalar birbirine dikkat eder (çizmesi fazla karmaşık olurdu!)
CNN’leri ne zaman, görsel transformerları ne zaman kullanmalı?
Bir CNN ile görsel transformerı ne zaman kullanacağımızı anlamak, bilgisayarlı görü iş akışlarımızda etkili mimari seçimler yapmak için oldukça önemlidir.
Her iki modelin de güçlü (ve zayıf!) yönleri vardır; ancak performansları, veri boyutu, hesaplama kaynakları ve modellemeye çalıştığımız görsel kalıpların karmaşıklığına bağlı olarak farklı koşullarda daha iyidir.
Aralarında seçim yaparken şu noktalara bakmayı seviyorum:
CNN’leri şu durumlarda kullanmalısınız:
Görsel Transformerları şu durumlarda kullanmalısınız:
Özetle, kendinizi bir düşük kaynaklı ortamda bulursanız veya kısıtlı veriyle hızlı ve güvenilir sonuçlara ihtiyacınız varsa, CNN’ler daha güvenli ve daha verimli bir seçenektir.
Öte yandan, projeniz görsel uzayda derin küresel akıl yürütme gerektiriyorsa ve bunu destekleyecek hesaplama gücünüz varsa, görsel transformerlar daha iyi bir seçenektir.
Bir Görsel Transformerin Bileşenleri
Şimdi Görsel Transformerin gerçek mimarisine dalalım. Birden fazla aşama (özellikle beş) olduğundan, gelin bunları tek tek inceleyelim.
Aşama 1: Görüntüyü yamalama
Bu, bir görüntüyü transformerin anlayabileceği bir forma dönüştürmemiz gereken ilk dönüşüm adımıdır.
224x224 bir görüntümüz olduğunu varsayalım. Tümünü beslemek yerine, onu daha küçük, sabit boyutlu yamalara böleriz. Her yama 16x16 ise (orijinal makalede önerildiği gibi), görüntü 14×14 = 196 yamaya bölünür; çünkü (224/16 =14).
Bunu anlamanın çok kolay bir yolu, bir fotoğrafı kusursuz eşit kare döşemelere kesmeyi düşünmektir. Her yama yerelleştirilmiş bilgi içerir ve bir cümledeki bir "kelime" gibi davranır.
Yukarıdaki çizimde, bir kurdun görüntüsünün daha küçük kare (ve eşit) parçalara — tam olarak 196’ya — bölündüğünü görebilirsiniz.
Yine de burada bir sorunuz olabilir:
“Görüntü RGB, peki 3 renk kanalı ne oluyor?”
Bu önemli bir noktadır; her yama aslında bir veri bloğudur ve bizim örneğimizde 16x16x3 biçimine sahiptir. 16x16 yükseklik ve genişliktir; 3 ise renk kanallarıdır; böylece her yama 3 boyutlu bir tensördür.
Bu da her yamayı, görüntünün yerel bir bölgesinden hem mekânsal hem de renk bilgisinin kompakt bir temsili yapar.
Yamalara bu bölünme, görüntünün 2B mekânsal yapısını bir 1B diziye dönüştürür; bu çok boyutlu veri dizisi, bir transformer modeli için uygundur.
Aşama 2: Yama gömme (embedding)
Sırada, her görüntü yamasını transformerin kullanabileceği sayısal bir temsile dönüştürmemiz gerekiyor.
Her 16x16 RGB yama bir vektöre düzleştirilir. Örneğimizde 16×16×3 = 768 değer. Esasen tüm piksel ve renk değerlerini tek bir sayı satırına açıyoruz.
Bu ham vektörler bilgilendirici olsa da, henüz öğrenmeye uygun bir uzayda değildir. Bu yüzden her birini bir eğitilebilir doğrusal izdüşüm katmanından geçiririz. Bunu, her 768 boyutlu girdiyi D (çoğunlukla yine 768, ama her zaman değil) boyutunda yeni bir gömme uzayına eşleyen yoğun bir katman olarak düşünebilirsiniz.
Neden?
Bu izdüşüm önemlidir; çünkü tüm yama belirteçlerini, transformer kodlayıcının beklediği tutarlı ve öğrenilebilir bir biçime hizalar. Bu noktaya kadar, her vektörün görüntünün bir yamasını temsil ettiği sabit uzunluklu vektörlerden oluşan bir dizimiz vardı.
Bu sürecin tamamı, mekânsal ve renk açısından zengin yamaları, transformerin görüntüyü NLP’deki kelime gömmelerine benzer şekilde bir öğrenilebilir varlıklar dizisi olarak ele almasına olanak tanıyan birleşik bir "belirteç" dizisine dönüştürür.
Aşama 3: Konumsal kodlama
Bu belirteçleri kodlayıcımıza göndermeden önce bir şey kaldı. Daha önce LLM’leri öğrendiyseniz bunu tahmin etmiş olabilirsiniz!
Transformerlar doğası gereği konumdan bağımsızdır.
Bu, girdi dizilerini sırasız koleksiyonlar olarak ele aldıkları, yani belirteçlerin sırasını veya konumunu anlamak için yerleşik bir mekanizmaya sahip olmadıkları anlamına gelir. Bu ise görüntü analizinde büyük bir sorundur; çünkü hem mekânsal yapı hem de yerleşim kritiktir!
Bunu ayrıntılı olarak konuşalım.
Görüntüler bağlamında, her yama orijinal görüntünün belirli bir bölgesini temsil eder. Modeli, her yamanın nereden geldiğini belirtmeden yama gömmelerinin bir dizisiyle beslersek, bir yamanın sol üst köşeden mi yoksa sağ alttan mı geldiğine dair hiçbir fikri olmaz.
Bu mekânsal farkındalık eksikliği, modelimizin desenleri, şekilleri, yapıları vb. anlamasını sınırlar.
Bunu çözmek için her yama gömmesine konumsal kodlama ekleriz. Bu, mekânsal bir etiket gibi davranan bir vektördür; yamanın görüntü içindeki orijinal konumunu kodlayan bir vektör. Bu konumsal vektörler, dizi transformere girmeden önce doğrudan yama gömmelerine eklenir.
İki yaygın konumsal kodlama türü vardır:
Bu noktada kafanız karıştıysa, bunu kavramanın kolay bir yolu konumsal kodlamaları yamalar için GPS koordinatları olarak düşünmektir.
Transformere belirtecin orijinal konumunu söylerler. Bu bilgiyi dahil ederek, öz-dikkat mekanizmasının her yamanın içeriğini ve görüntü içindeki göreli veya mutlak konumunu modellemesine izin veririz.
Bu adım çok kritiktir — olmadan, Görsel Transformer dikkat mekanizması ne kadar güçlü olursa olsun bir görüntünün yapısını yeniden kuramazdı.
Aşama 4: Transformer kodlayıcı bloğu
Şimdi tüm derin öğrenmenin gerçekleştiği noktaya geldik — desen keşfi, bağlam modelleme ve özellik füzyonu.
Tam Görsel Transformer Kodlayıcıyı oluşturmak için bu Kodlayıcı bloklarından birkaçı üst üste yığılır. Her kodlayıcı bloğunun neler içerdiğine bakalım:
Genel olarak, bu kodlayıcı blokları katmanlar halinde (ör. ViT-Base’de 12) yığılır ve her katmanda daha derin görüntü temsilleri öğrenilir.
Aşama 5: Sınıflandırma belirteci ve MLP başı
Neredeyse geldik! Şimdi (klasik) ViT’nin son ve nihai aşamasına geçelim.
Tüm kodlayıcı katmanlarından sonra, her şeyi özetlemenin ve bir tahmin yapmanın bir yoluna ihtiyacımız var.
Bu yüzden yama dizisinin başına özel bir [CLS] belirteci ekleriz. Bu, kodlama sırasında diğer tüm belirteçlerle etkileşime giren öğrenilebilir bir gömmedir.
Transformer katmanları boyunca ilerlerken küresel bilgi toplar. Sonunda bu belirteci çıkarır ve başka bir çok katmanlı algılayıcı (MLP) başından geçiririz; bu genellikle birkaç yoğun katmanın ardından (sınıflandırma için) bir softmax’tır.
Bu son adım bize tahmin edilen etiketi verir; örneğin, [CLS] belirteci tarafından toplanan bilgilere dayanarak “bu görüntü bir köpek” demek gibi. Şunu not etmek çok önemlidir: Son MLP Başına yalnızca [CLS belirteci] gönderilir ve bu nedenle sınıflandırmada o kullanılır; diğer belirteçler değil!
Dikkate Değer Görsel Transformer Mimarileri
Şimdi devrim niteliğindeki bazı Görsel Transformer mimarilerine bakalım.
Önceden Eğitilmiş Görsel Transformerları Kullanma
Çoğu zaman bir ViT’yi sıfırdan eğitmeyeceğiz! Bu yüzden popüler derin öğrenme kütüphanelerinden önceden eğitilmiş ViT modellerini nasıl kullanabileceğimizi keşfedelim.
HuggingFace transformers kütüphanesi
Görsel transformerları kullanmanın en kolay ve en güvenilir yollarından biri Hugging Face Transformers kütüphanesidir. Sadece birkaç satır kodla kullanıma hazır önceden eğitilmiş ViT modelleri sunar.
Orijinal ViT Base modelini indirmek ve kullanmak için burada biraz kod yazdım:
Bu kodu biraz daha derinlemesine konuşalım. Öncelikle, iki ayrı bileşen indirmeniz gerektiği konusunda bir sorunuz olabilir. Bunlar ayrı olmakla birlikte birbirini tamamlar:
ViTImageProcessor– Görüntü, modele aktarılmadan önce ön işlemeden sorumludur. Yeniden boyutlandırmayı, normalleştirmeyi ve görüntüyü görsel transformerin beklediği biçime dönüştürmeyi yönetir. Bunu, NLP’de belirteçleyicinin (tokenizer) görsel karşılığı olarak düşünebilirsiniz!ViTForImageClassification– Bu, çıkarımı gerçekleştiren asıl modeldir. Belirli bir tensör biçiminde girdiler bekler ve (ör. logitler veya sınıf olasılıkları) tahminler üretir.Bir diğer şüphe de
output.logitshakkında olabilir; daha spesifik olarak logitlerin ne olduğu hakkında.Makine öğrenmesi modellerinde — özellikle sınıflandırma modellerinde — logitler, modelin son katmanı tarafından herhangi bir softmax gibi aktivasyon fonksiyonu uygulanmadan önce üretilen ham çıktı değerleridir. Her sınıf için normalleştirilmemiş puanları temsil ederler.
Bunları, modelin her sınıf için iç güven düzeyleri olarak düşünebilirsiniz. Bu değerler pozitif veya negatif olabilir ve toplamları bire eşit olmak zorunda değildir.
Logitleri olasılıklara dönüştürmek için, değerleri bir olasılık dağılımına ölçekleyen softmax fonksiyonunu uygulamamız gerekir.
Dolayısıyla
argmax(logits, -1)kullandığımızda, basitçe en yüksek ham skora sahip olan sınıfın (softmax sonrası en yüksek olasılığa karşılık gelen) indeksini seçeriz.timm kütüphanesini kullanma
Görsel transformerları kullanmak için bir diğer harika ve ünlü kütüphane
timm’dir (Ross Wightman tarafından). Birçok önceden eğitilmiş ViT varyantı sunar ve hızlı denemeler veya ince ayar için uygundur. Bir ViT modelini çıkarım için nasıl yükleyip kullanabileceğimiz şöyledir:Artık
timmiletransformerskütüphaneleri arasındaki benzerliği görebilmelisiniz. Her ikisi de önceden eğitilmiş ViT modelleri sağlar, görüntü işlemeye olanak tanır (her ne kadartimm’de standart PyTorch kodu kullansak da) ve sonunda en yüksek logite sahip sınıfı elde ederiz.Sonuç
Genel olarak, görsel transformerlar görüntüleri yama “cümlelerine” dönüştürerek ve ilk katmandan itibaren küresel bağlamı yakalamak için öz-dikkati kullanarak bilgisayarlı görüyü yeniden şekillendirdi. Bu eğitimde şunları öğrendik:
Öğrenmeye devam etmek için, Transformerların nasıl çalıştığını anlatan şu makaleye göz atmanızı öneririm: Transformerlar Nasıl Çalışır; Transformerların arkasındaki teoriyi öğreneceksiniz. Bunu pekiştirmek için de sıfırdan bir transformer nasıl inşa edilir konusunu keşfetmenizi öneririm.
Her ikisini de aynı anda, uygulamalı şekilde öğrenmek isterseniz PyTorch ile Transformer Modelleri kursumuz tam size göre.