CodeBlanks Logo Icon CodeBlanks

CNN modeli

Conv2d ve MaxPool2d ile CNN tanımlarsın.

CNN modeli

İki evrişim bloğu ve bir doğrusal sınıflandırıcıdan oluşan küçük bir model yeterlidir. 16×16 görüntü her havuzlamada yarıya iner: 16 → 8 → 4:

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),    # (8, 8, 8)
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),   # (16, 4, 4)
    nn.Flatten(),                                                 # 256
    nn.Linear(16 * 4 * 4, 2))

İlk katmanın filtreleri eğitimden sonra yatay ve dikey kenar dedektörlerine benzemeye başlar.

Ara şekilleri yazdırmak

nn.Sequential modülleri tek tek gezilebilir; her katmandan sonra şekli yazdırmak mimariyi doğrulamanın hızlı yoludur:

x = torch.zeros(1, 1, 16, 16)
for katman in model:
    x = katman(x)
    print(type(katman).__name__, tuple(x.shape))

Ağırlıklı katmanların parametre sayısı ayrıca hesaplanıp toplam model boyutu kontrol edilir.

Uygulama Modeli kur

Verilen model için (1, 1, 16, 16) girdinin her MaxPool2d sonrasındaki şeklini alt alta yazdır. Ardından modelin toplam parametre sayısını yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(), nn.Linear(16 * 4 * 4, 2))

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(), nn.Linear(16 * 4 * 4, 2))

x = torch.zeros(1, 1, 16, 16)
for katman in model:
    x = katman(x)
    if isinstance(katman, nn.MaxPool2d):
        print(x.shape)
print(sum(p.numel() for p in model.parameters()))

Beklenen çıktı

torch.Size([1, 8, 8, 8])
torch.Size([1, 16, 4, 4])
1762

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bu modelde Flatten sonrası kaç özellik vardır?

  • 1024
  • 64
  • 256 Doğru cevap
  • 16

Açıklama: 16 kanal × 4 × 4 = 256.

2 Katman adını yazdır.

Soru
print(type(katman).____, tuple(x.shape))
Cevap
print(type(katman).__name__, tuple(x.shape))

Açıklama: __name__ sınıfın adını verir.

3 Şekilleri eşleştir (girdi 1×16×16).

Kavram Anlamı
Conv2d(1, 8) + Pool (8, 8, 8)
Conv2d(8, 16) + Pool (16, 4, 4)
Flatten 256
Linear 2

İleri seviye bölümündeki tüm dersler