Okullar için Robotik ve Mühendislik · anaokulundan liseye

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ı

Linear(n, m): n·m + m    Conv2d(cin, cout, k): cout·cin·k² + cout

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

Python: nn.Module ile model ve parametre sayımı
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

  1. nn.Linear(128, 10) kaç parametre içerir?

  2. nn.Conv2d(3, 16, 3) kaç parametre içerir?

  3. Katmanları self.katmanlar = [nn.Linear(...), ...] diye sıradan listede tutarsan ne olur?

  4. (16, 7, 7) şekilli öznitelik haritası Flatten'dan sonra Linear'a girecek. Linear'ın giriş boyu ne olmalı?

Bu üniteden sonra bitirme projesinde

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç