3. ünite / 10
nn.Module: katmanlar, parametreler ve model yazmak
nn.Module alt sınıfı, __init__ ve forward, nn.Sequential, Linear ve Conv2d, parametre sayımı, state_dict.
Bu ünitenin sonunda
- nn.Module alt sınıfı yazıp katmanları __init__'te, hesabı forward'da tanımlamak
- Linear ve Conv2d katmanlarının parametre sayısını elle hesaplamak
- Katman katman şekil izleyip uyuşmazlığı bulmak
- state_dict ile ağırlıkları kaydetmek ve yüklemek
Ders notları
PyTorch'ta bir model, nn.Module'den türeyen bir sınıftır. __init__'te katmanlar oluşturulur ve özellik olarak atanır; PyTorch bu atamaları izleyerek tüm parametreleri bulur (model.parameters()). forward verinin nasıl aktığını tanımlar; modeli model(x) diye çağırırsın, forward'u doğrudan değil.
Parametre sayısı
Evrişim katmanının parametre sayısı görüntü boyundan bağımsızdır; tam bağlı katmanınki girdinin boyuna bağlıdır. Bu yüzden CNN'lerde parametrelerin çoğu sondaki Linear'dadır.
Şekil izleme
Katmanlar arasındaki en sık hata Flatten'dan sonraki Linear'ın giriş boyudur: 16 kanal × 7 × 7 = 784. Bunu her seferinde elle hesaplamak yerine rastgele bir girdiyi modelden geçirip ara şekilleri yazdırmak (ya da torchinfo.summary) en güvenli yoldur. nn.LazyLinear giriş boyunu ilk çağrıda kendisi bulur.
Kaydetme
model.state_dict(), parametre adlarından tensörlere bir sözlüktür. torch.save(model.state_dict(), "m.pt") ile kaydedilir, aynı sınıftan yeni bir model kurulup load_state_dict ile yüklenir. Tüm nesneyi pickle'lamak sınıf kodu değişince kırılır.
Görselleştirici
nn.Sequential kurucu: şekiller ve parametre sayısı
Katmanları sırayla ekle (Linear, Conv2d, ReLU, MaxPool2d, Flatten, Dropout). Her katmanın çıkış şekli ve parametre sayısı torchinfo özeti gibi hesaplanır; şekil uyuşmazlığı hangi katmanda olduğunu söyler.
Kendin dene
Katman kurucusunda hazır "MNIST CNN"i yükle ve her satırdaki şekli ve parametre sayısını formülle doğrula. Sonra son Linear'ın girişini 100 yap: hata hangi satırda çıktı, ileti ne diyor? İkinci MaxPool2d'yi sil ve Linear'ın yeni giriş boyunu bul. Son olarak parametrelerin yüzde kaçının son katmanda olduğunu hesapla.
Kod
import torch
from torch import nn
class Siniflandirici(nn.Module):
def __init__(self, n_in=2, gizli=16, n_out=1):
super().__init__() # unutma: parametre kaydı burada başlar
self.net = nn.Sequential(
nn.Linear(n_in, gizli), nn.ReLU(),
nn.Linear(gizli, gizli), nn.ReLU(),
nn.Linear(gizli, n_out), # ham skor (logit), sigmoid yok
)
def forward(self, x):
return self.net(x)
model = Siniflandirici()
print(model)
print(sum(p.numel() for p in model.parameters()), 'parametre') # 2·16+16 + 16·16+16 + 16+1 = 337
for name, p in model.named_parameters():
print(f'{name:14s} {tuple(p.shape)}')
x = torch.randn(5, 2) # 5 örneklik yığın
print(model(x).shape) # torch.Size([5, 1])Colab defteri
PyTorch tarayıcıda çalışmaz; gerçek kodu Google Colab'da (ücretsiz GPU ile) çalıştır. Defteri indir, colab.research.google.com adresinde "Dosya → Not defteri yükle" ile aç, "Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU" seç ve hücreleri sırayla çalıştır.
Defteri indir (.ipynb)Sık yapılan hatalar
- super().__init__() çağırmayı unutmak: "cannot assign module before Module.__init__() call" hatası.
- Katmanları sıradan bir Python listesinde tutmak: parametreler model.parameters()'ta görünmez, eğitilmez. nn.ModuleList kullan.
- forward'u doğrudan çağırmak (model.forward(x)): kancalar (hook) çalışmaz; model(x) kullan.
- Flatten sonrası giriş boyunu yanlış hesaplamak: "mat1 and mat2 shapes cannot be multiplied" hatası.
Yazılım mühendisliği bağlantısı
nn.Module, bileşim (composition) ilkesinin güzel bir örneğidir: büyük model küçük modüllerden kurulur, her biri ayrı test edilebilir.
- Bloklar (ör. evrişim + ReLU + havuzlama) için ayrı sınıflar yaz; her biri için şekil testi ekle.
- Model yapılandırmasını (katman sayısı, genişlik) bir veri sınıfında tut; deneyleri kodu değiştirmeden yapılandırmayla değiştir.
Kendini sına
nn.Linear(128, 10) kaç parametre içerir?
nn.Conv2d(3, 16, 3) kaç parametre içerir?
Katmanları self.katmanlar = [nn.Linear(...), ...] diye sıradan listede tutarsan ne olur?
(16, 7, 7) şekilli öznitelik haritası Flatten'dan sonra Linear'a girecek. Linear'ın giriş boyu ne olmalı?
Bu üniteden sonra bitirme projesinde
- Öneri ve model taslağı: Kapsam, gereksinimler (G1–G6), model sınıfı ve şekil testi.