Makine Öğrenmesi
__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.
Örnek çözümü göster
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()))
Kendini test et
-
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
Cevabı göster
Parametreleri kaydedilmez; optimize edici onları görmez — Liste için nn.ModuleList kullanılmalıdır.
-
Üst sınıfın kurucusunu çağır.
def __init__(self):
____().__init__()
Cevabı göster
def __init__(self):
super().__init__()
-
Kapsayıcıları eşleştir.
- nn.ModuleList
- Kayıtlı katman listesi
- nn.ModuleDict
- Adlı katmanlar
- nn.Parameter
- Özel öğrenilen tensör
- Python listesi
- Kaydedilmez
Sıradaki ders: forward