CNN modeli
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 60/78
- 7 dk
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
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
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.
print(type(katman).____, tuple(x.shape))
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 |