CodeBlanks Logo Icon CodeBlanks

__init__

__init__ metodunda katmanlar tanımlanır.

__init__

__init__ içinde önce super().__init__() çağrılır, sonra katmanlar öznitelik olarak atanır. Modüle atanan her nn.Module ya da nn.Parameter otomatik kaydedilir:

class Siniflandirici(nn.Module):
    def __init__(self, girdi, gizli, sinif):
        super().__init__()
        self.gizli = nn.Linear(girdi, gizli)
        self.cikti = nn.Linear(gizli, sinif)
        self.olcek = nn.Parameter(torch.ones(1))   # özel parametre

super().__init__() unutulursa ilk atamada "cannot assign module before Module.__init__() call" hatası alınır.

ModuleList ve ModuleDict

Değişken sayıda katman gerekiyorsa nn.ModuleList, adlı katmanlar için nn.ModuleDict kullanılır; içerikleri kayıtlı alt modül olur:

class Derin(nn.Module):
    def __init__(self, boyutlar):
        super().__init__()
        self.katmanlar = nn.ModuleList(
            nn.Linear(a, b) for a, b in zip(boyutlar[:-1], boyutlar[1:]))

    def forward(self, x):
        for k in self.katmanlar[:-1]:
            x = torch.relu(k(x))
        return self.katmanlar[-1](x)

Sıradan liste kullanılırsa parameters() boş döner ve model hiç öğrenmez; hata da vermez.

Uygulama Liste tuzağı

İki model sınıfı verildi: biri katmanları Python listesinde, diğeri nn.ModuleList'te tutar. Her ikisinin parametre sayısını (sum(p.numel() for p in m.parameters())) aynı satırda yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

class ListeModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.katmanlar = [nn.Linear(4, 4), nn.Linear(4, 2)]

class ModulModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.katmanlar = nn.ModuleList([nn.Linear(4, 4), nn.Linear(4, 2)])

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

class ListeModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.katmanlar = [nn.Linear(4, 4), nn.Linear(4, 2)]

class ModulModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.katmanlar = nn.ModuleList([nn.Linear(4, 4), nn.Linear(4, 2)])

say = lambda m: sum(p.numel() for p in m.parameters())
print(say(ListeModel()), say(ModulModel()))

Beklenen çıktı

0 30

Soru ve cevaplar

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

1 Katmanlar sıradan bir Python listesinde tutulursa ne olur?

  • Sorunsuz çalışır
  • Hata verir
  • Daha hızlı olur
  • Parametreleri kaydedilmez; optimize edici onları görmez Doğru cevap

Açıklama: Liste için nn.ModuleList kullanılmalıdır.

2 Üst sınıfın kurucusunu çağır.

Soru
def __init__(self):
    ____().__init__()
Cevap
def __init__(self):
    super().__init__()

Açıklama: super().__init__() modül altyapısını kurar.

3 Kapsayıcıları eşleştir.

Kavram Anlamı
nn.ModuleList Kayıtlı katman listesi
nn.ModuleDict Adlı katmanlar
nn.Parameter Özel öğrenilen tensör
Python listesi Kaydedilmez

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