Deep Learning • Convolutional Neural Networks • Self-Attention • Feature Embedding Analysis
Bu projede, çiçek görüntülerinin otomatik olarak sınıflandırılması amacıyla Convolutional Neural Network (CNN) tabanlı bir derin öğrenme mimarisi geliştirilmiştir. Klasik CNN yapısına ek olarak, modelin ayırt edici özellikleri daha etkin öğrenebilmesi için Self-Attention mekanizması entegre edilmiştir.
Çalışma kapsamında yalnızca sınıflandırma doğruluğu değil, aynı zamanda öğrenilen özniteliklerin (feature embeddings) yapısı da analiz edilmiştir. Bu amaçla PCA ve UMAP gibi boyut indirgeme teknikleri kullanılarak, modelin iç temsilleri görselleştirilmiştir.
Veriler torchvision.datasets.Flowers102 ile yüklenmiştir. Eğitim verisine yatay çevirme, döndürme ve renk jitter gibi artırma teknikleri uygulanmıştır. Doğrulama ve testte yalnızca yeniden boyutlandırma ve tensöre çevirme kullanılmıştır.
class SelfAttention(nn.Module):
def __init__(self, in_dim):
super(SelfAttention, self).__init__()
self.query = nn.Conv2d(in_dim, in_dim // 8, 1)
self.key = nn.Conv2d(in_dim, in_dim // 8, 1)
self.value = nn.Conv2d(in_dim, in_dim, 1)
self.gamma = nn.Parameter(torch.zeros(1))
def forward(self, x):
B, C, H, W = x.size()
q = self.query(x).view(B, -1, H*W)
k = self.key(x).view(B, -1, H*W)
v = self.value(x).view(B, -1, H*W)
attention = torch.softmax(torch.bmm(q.permute(0,2,1), k), dim=-1)
out = torch.bmm(v, attention.permute(0,2,1))
out = out.view(B, C, H, W)
return self.gamma * out + x
Bu yapı sayesinde model, görüntü üzerindeki farklı bölgeler arasındaki ilişkileri öğrenerek sınıflandırma performansını artırmaktadır.
Kod Bloğu: Veri artırma (train transforms)
from torchvision import transforms
train_tfms = transforms.Compose([
transforms.Resize((224, 224)),
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor()
])
val_tfms = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
Base CNN korunarak her konvolüsyon bloğunun sonuna Squeeze-and-Excitation eklenmiştir. SE bloğu kanallar üzerinde “dikkat” (attention) ağırlıkları üretir.
Kod Bloğu: Squeeze-and-Excitation (SE) bloğu (PyTorch)
import torch
import torch.nn as nn
class SEBlock(nn.Module):
def __init__(self, channels, reduction=16):
super().__init__()
self.pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channels, channels // reduction),
nn.ReLU(inplace=True),
nn.Linear(channels // reduction, channels),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
w = self.pool(x).view(b, c) # squeeze
w = self.fc(w).view(b, c, 1, 1) # excitation
return x * w
ImageNet üzerinde önceden eğitilmiş EfficientNet B0 kullanılmış; son katman 20 sınıfa göre değiştirilmiştir. Transfer learning ile küçük veri senaryosunda yüksek doğruluk hedeflenmiştir.
Kod Bloğu: EfficientNet B0 (Transfer Learning)
import torch.nn as nn
from torchvision import models
model = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT)
# son katmanı 20 sınıfa uyarlama
in_features = model.classifier[1].in_features
model.classifier[1] = nn.Linear(in_features, 20)
CNN, Self-Attention ve EfficientNet modellerinin doğruluk (accuracy) karşılaştırması
Eğitim ve doğrulama loss eğrilerinin karşılaştırılması
Modelin öğrendiği temsil uzayını incelemek amacıyla, CNN katmanlarından elde edilen öznitelikler PCA ve UMAP yöntemleri ile 3 boyuta indirgenmiştir. Bu analiz, sınıflar arasındaki ayrışmanın görsel olarak değerlendirilmesini sağlamaktadır.
3D PCA – CNN Feature Embeddings
3D UMAP – CNN Feature Embeddings
Base CNN ve CNN+SE modelleri düşük veri miktarı ile (200 eğitim örneği) 20 sınıflı problem çözdüğü için doğruluk oranları sınırlı kalmıştır. Transfer learning yaklaşımı ile EfficientNet modeli belirgin şekilde daha yüksek test doğruluğu elde etmiştir.
Bu proje için GitHub linki paylaşılmamıştır. Proje çıktıları ve metodoloji rapor üzerinden dokümante edilmiştir.
Bu projeye ait detaylı teknik raporu aşağıdan görüntüleyebilir veya yeni sekmede açabilirsiniz.
PDF’yi Yeni Sekmede Aç