__init__
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 30/78
- 5 dk
__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 parametresuper().__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
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
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.
def __init__(self):
____().__init__()
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 |