2026'da PyTorch ile Bilgisayarla Görü: CNN, Transfer Öğrenme ve Mülakat Soruları

PyTorch kullanarak bilgisayarla görü üzerine kapsamlı rehber. Evrişimli sinir ağları (CNN), transfer öğrenme tekniklerini öğrenin ve iş mülakatlarına hazırlanın.

PyTorch ile bilgisayarla görü - evrişimli sinir ağları ve transfer öğrenme

Bilgisayarla görü, makine öğrenmesinin en hızlı gelişen alanlarından birini oluşturmaktadır. 2026 yılında PyTorch, görüntü işleme modelleri oluşturmak için lider çerçeve olmaya devam etmekte, sezgisel API'si ve sinir ağlarını eğitmek için güçlü araçlar sunmaktadır.

Bu rehbere başlamadan önce Python ve derin öğrenme kavramları hakkında temel bilgi sahibi olmak faydalı olacaktır. Kod örnekleri PyTorch 2.5 ve torchvision 0.20 ile test edilmiştir.

Evrişimli Sinir Ağlarına (CNN) Giriş

Evrişimli Sinir Ağları (Convolutional Neural Networks), modern bilgisayarla görünün temelini oluşturmaktadır. CNN mimarisi, görüntüler gibi ızgara yapısındaki verileri işlemek için özel olarak tasarlanmıştır. Temel bileşen, yerel desenleri tespit etmek için filtreler uygulayan evrişim katmanıdır.

Temel CNN yapısı üç ana katman türünden oluşmaktadır:

  • Evrişim katmanları - filtreleri görüntü üzerinde kaydırarak yerel özellikleri tespit eder
  • Havuzlama katmanları - en önemli bilgileri koruyarak boyutları azaltır
  • Tam bağlı katmanlar - çıkarılan özellikler üzerinde son sınıflandırmayı gerçekleştirir
python
import torch
import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self, num_classes=10):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(32)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(64)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.bn3 = nn.BatchNorm2d(128)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(128 * 4 * 4, 512)
        self.fc2 = nn.Linear(512, num_classes)
        self.dropout = nn.Dropout(0.5)
    
    def forward(self, x):
        x = self.pool(F.relu(self.bn1(self.conv1(x))))
        x = self.pool(F.relu(self.bn2(self.conv2(x))))
        x = self.pool(F.relu(self.bn3(self.conv3(x))))
        x = x.view(-1, 128 * 4 * 4)
        x = self.dropout(F.relu(self.fc1(x)))
        x = self.fc2(x)
        return x

Yukarıdaki kod, üç evrişim katmanı, batch normalizasyon ve havuzlama katmanları içeren basit bir CNN tanımlamaktadır. Bu mimari, 32x32 piksel boyutundaki görüntülerin sınıflandırılması için uygundur.

torchvision ile Veri Hazırlama

Verilerin doğru şekilde hazırlanması, model başarısı için kritik öneme sahiptir. torchvision kütüphanesi, popüler veri setlerini yüklemek ve veri artırma işlemleri gerçekleştirmek için araçlar sağlamaktadır.

python
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# Eğitim verileri için dönüşümlerin tanımlanması
train_transform = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

# Test verileri için dönüşümler (artırma olmadan)
test_transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

# CIFAR-10 veri setinin yüklenmesi
train_dataset = torchvision.datasets.CIFAR10(
    root='./data', train=True, download=True, transform=train_transform
)
test_dataset = torchvision.datasets.CIFAR10(
    root='./data', train=False, download=True, transform=test_transform
)

train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False, num_workers=4)

Veri artırma, eğitim setinin çeşitliliğini yapay olarak artırarak aşırı öğrenmeyi (overfitting) önlemeye yardımcı olmaktadır. Her görüntü rastgele kırpılabilir, döndürülebilir veya parlaklık açısından değiştirilebilir.

Önceden Eğitilmiş Modellerle Transfer Öğrenme

Transfer öğrenme, ImageNet gibi büyük veri setleri üzerinde eğitilmiş modellerden elde edilen bilgiyi kullanmaya olanak tanımaktadır. Sınırlı miktarda eğitim verisi olduğunda bu yaklaşım özellikle değerlidir.

python
import torchvision.models as models

def create_transfer_model(num_classes, freeze_backbone=True):
    # Önceden eğitilmiş ResNet50'nin yüklenmesi
    model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
    
    # Backbone katmanlarının dondurulması (isteğe bağlı)
    if freeze_backbone:
        for param in model.parameters():
            param.requires_grad = False
    
    # Sınıflandırma katmanının değiştirilmesi
    num_features = model.fc.in_features
    model.fc = nn.Sequential(
        nn.Linear(num_features, 512),
        nn.ReLU(),
        nn.Dropout(0.3),
        nn.Linear(512, num_classes)
    )
    
    return model

# 10 sınıf için model oluşturma
model = create_transfer_model(num_classes=10, freeze_backbone=True)

Dondurulmuş backbone yaklaşımı, veri seti küçük olduğunda faydalıdır. Bu durumda yalnızca yeni sınıflandırma katmanları eğitilir, bu da süreci hızlandırır ve aşırı öğrenme riskini azaltır.

Eğitim Döngüsü ve Doğrulama

Etkili bir eğitim döngüsünün uygulanması birçok yönün dikkate alınmasını gerektirir: optimize edici, öğrenme oranı programı ve metriklerin izlenmesi.

python
import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR
from tqdm import tqdm

def train_model(model, train_loader, test_loader, epochs=50, device='cuda'):
    model = model.to(device)
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
    scheduler = CosineAnnealingLR(optimizer, T_max=epochs)
    
    best_accuracy = 0.0
    
    for epoch in range(epochs):
        # Eğitim aşaması
        model.train()
        running_loss = 0.0
        correct = 0
        total = 0
        
        for images, labels in tqdm(train_loader, desc=f'Epoch {epoch+1}/{epochs}'):
            images, labels = images.to(device), labels.to(device)
            
            optimizer.zero_grad()
            outputs = model(images)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            
            running_loss += loss.item()
            _, predicted = outputs.max(1)
            total += labels.size(0)
            correct += predicted.eq(labels).sum().item()
        
        train_accuracy = 100. * correct / total
        
        # Doğrulama aşaması
        model.eval()
        test_correct = 0
        test_total = 0
        
        with torch.no_grad():
            for images, labels in test_loader:
                images, labels = images.to(device), labels.to(device)
                outputs = model(images)
                _, predicted = outputs.max(1)
                test_total += labels.size(0)
                test_correct += predicted.eq(labels).sum().item()
        
        test_accuracy = 100. * test_correct / test_total
        scheduler.step()
        
        print(f'Epoch {epoch+1}: Train Acc: {train_accuracy:.2f}%, Test Acc: {test_accuracy:.2f}%')
        
        if test_accuracy > best_accuracy:
            best_accuracy = test_accuracy
            torch.save(model.state_dict(), 'best_model.pth')
    
    return best_accuracy

CosineAnnealingLR programı öğrenme oranını kademeli olarak azaltarak daha iyi yakınsama sağlamaya yardımcı olmaktadır. En iyi modelin kaydedilmesi, optimal ağırlıkların korunmasını garanti eder.

İleri Teknikler: Attention ve Feature Pyramid

Modern CNN mimarileri, uzamsal bağımlılıkları daha iyi yakalamak için sıklıkla attention mekanizmaları ve piramit yapıları kullanmaktadır.

python
class ChannelAttention(nn.Module):
    def __init__(self, channels, reduction=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channels, channels // reduction, bias=False),
            nn.ReLU(),
            nn.Linear(channels // reduction, channels, bias=False)
        )
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        b, c, _, _ = x.size()
        avg_out = self.fc(self.avg_pool(x).view(b, c))
        max_out = self.fc(self.max_pool(x).view(b, c))
        attention = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)
        return x * attention

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        attention = self.sigmoid(self.conv(torch.cat([avg_out, max_out], dim=1)))
        return x * attention

Attention mekanizmaları, ağın görüntünün en ilgili bölgelerine odaklanmasını sağlayarak hesaplama karmaşıklığında minimum artışla sınıflandırma doğruluğunu artırmaktadır.

Sonuçların Değerlendirilmesi ve Görselleştirilmesi

Sonuçların görselleştirilmesi, modelin davranışını anlamaya ve potansiyel sorunları belirlemeye yardımcı olmaktadır.

python
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns

def evaluate_model(model, test_loader, class_names, device='cuda'):
    model.eval()
    all_predictions = []
    all_labels = []
    
    with torch.no_grad():
        for images, labels in test_loader:
            images = images.to(device)
            outputs = model(images)
            _, predicted = outputs.max(1)
            all_predictions.extend(predicted.cpu().numpy())
            all_labels.extend(labels.numpy())
    
    # Karışıklık matrisi
    cm = confusion_matrix(all_labels, all_predictions)
    plt.figure(figsize=(10, 8))
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
                xticklabels=class_names, yticklabels=class_names)
    plt.xlabel('Tahmin')
    plt.ylabel('Gerçek Etiket')
    plt.title('Karışıklık Matrisi')
    plt.tight_layout()
    plt.savefig('confusion_matrix.png', dpi=150)
    
    # Sınıflandırma raporu
    print(classification_report(all_labels, all_predictions, target_names=class_names))

Data Science & ML mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Bilgisayarla Görü Mülakat Soruları

Makine öğrenmesi pozisyonları için yapılan iş mülakatlarında bilgisayarla görü ile ilgili sorular sıklıkla karşılaşılmaktadır. Aşağıda en önemli konular ve cevapları sunulmaktadır.

Soru 1: Evrişim ile havuzlama arasındaki fark nedir?

Evrişim, özellikleri tespit etmek için öğrenilebilir filtreler uygularken, havuzlama öğrenilecek parametre olmadan değerleri toplayarak (maksimum veya ortalama) boyutluluğu azaltır. Evrişim kanal sayısını korur veya artırır, havuzlama uzamsal çözünürlüğü azaltır.

Soru 2: Batch normalizasyon neden kullanılır?

Batch normalizasyon, her katmanın aktivasyonlarını normalize ederek öğrenme sürecini stabilize eder. Faydaları şunlardır: daha hızlı yakınsama, daha yüksek öğrenme oranları kullanabilme, düzenleme (overfitting azaltma) ve ağırlık başlatmaya duyarlılığın azaltılması.

Soru 3: Transfer öğrenme nasıl çalışır?

Transfer öğrenme, büyük bir veri seti (örn. ImageNet) üzerinde önceden eğitilmiş bir modelden elde edilen bilgiyi yeni bir görev için kullanır. CNN'in alt katmanları, farklı görevler için yararlı olan evrensel özellikleri (kenarlar, dokular) tespit eder. Üst katmanlar yeni problemin özelliklerine uyarlanır.

Soru 4: Receptive field nedir?

Receptive field, belirli bir katmandaki tek bir nöronun değerini etkileyen giriş görüntüsünün alanıdır. Daha derin katmanlar daha büyük receptive field'a sahiptir, bu da daha global desenleri tespit etmelerini sağlar.

Soru 5: Dengesiz sınıflarla nasıl başa çıkılır?

Stratejiler şunları içermektedir: kayıp fonksiyonunu ağırlıklandırma (weighted cross-entropy), azınlık sınıfını oversampling, çoğunluk sınıfını undersampling, yetersiz temsil edilen sınıflar için veri artırma ve focal loss gibi teknikler.

python
# Ağırlıklı kayıp fonksiyonu örneği
class_weights = torch.tensor([1.0, 2.5, 1.0, 3.0, 1.5, 1.0, 2.0, 1.0, 1.5, 1.0])
criterion = nn.CrossEntropyLoss(weight=class_weights.to(device))

Soru 6: Stride ve padding arasındaki farkı açıklayın

Stride, filtrenin kayma adımını belirler - daha büyük stride çıkış boyutlarını azaltır. Padding, görüntünün çevresine değerler (genellikle sıfırlar) ekler - uzamsal boyutları korumaya ve kenar piksellerini daha iyi işlemeye olanak tanır.

Soru 7: Veri artırma nedir ve neden önemlidir?

Veri artırma, dönüşümler (döndürme, kaydırma, parlaklık değişiklikleri) uygulayarak eğitim setini yapay olarak büyütme tekniğidir. Özellikle küçük veri setlerinde modelin genelleme yeteneğine yardımcı olur ve overfitting'i azaltır.

Performans Optimizasyonu ve Dağıtım

Modelin üretim dağıtımına hazırlanması hem hız hem de boyut açısından optimizasyon gerektirmektedir.

python
import torch.quantization

def optimize_for_inference(model, example_input):
    model.eval()
    
    # TorchScript'e dönüştürme
    scripted_model = torch.jit.trace(model, example_input)
    scripted_model.save('model_scripted.pt')
    
    # Dinamik kuantizasyon
    quantized_model = torch.quantization.quantize_dynamic(
        model, {nn.Linear}, dtype=torch.qint8
    )
    
    return scripted_model, quantized_model

# Kullanım örneği
example = torch.randn(1, 3, 224, 224)
scripted, quantized = optimize_for_inference(model.cpu(), example)

Kuantizasyon, doğrulukta minimum kayıpla model boyutunu dört kata kadar azaltabilir. TorchScript, modellerin Python yorumlayıcısı olmadan çalıştırılmasına olanak tanır.

Sonuç

2026 yılında PyTorch ile bilgisayarla görü, görüntü sınıflandırma sistemleri oluşturmak için güçlü araçlar sunmaktadır. Başarının temel unsurları CNN mimarisini anlamak, transfer öğrenmeyi etkili bir şekilde kullanmak ve eğitim verilerini uygun şekilde hazırlamaktır.

Sunulan kavramların - temel evrişimli ağlardan gelişmiş attention mekanizmalarına kadar - kavranması, hem üretim projelerinin uygulanması hem de makine öğrenmesi alanındaki iş mülakatları için sağlam bir temel oluşturmaktadır.

Farklı veri setleriyle düzenli pratik yapmak ve mimarilerle denemeler yapmak, bu konuların daha derin anlaşılmasına ve gerçek dünya uygulamalarındaki bilgisayarla görü zorluklarına hazırlanmaya yardımcı olacaktır.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

Fullstack geliştirici, SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

14 Ağustos 2026 tarihinde güncellendi

Etiketler

#pytorch
#computer-vision
#cnn
#transfer-learning
#deep-learning

Paylaş

İlgili makaleler