Meydan okuma 2
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 76/78
- 8 dk
nn.Module ile model tanımlarsın.
Meydan okuma 2: dizi toplamı
Bir LSTM'e 12 adımlık sayı dizilerinin toplamını tahmin etmeyi öğreteceksin. Model her adımda bir sayı görür; sonucu üretmek için gizli durumda bir "birikim" tutmayı öğrenmesi gerekir:
X = torch.randn(512, 12, 1) # 512 dizi, 12 adım, 1 özellik
y = X.sum(dim=1) # (512, 1) hedef
lstm = nn.LSTM(1, 32, batch_first=True)
bas = nn.Linear(32, 1)Hedefin standart sapması √12 ≈ 3.46'dır; her zaman 0 tahmin eden bir model MSE ≈ 12 alır. Başarı bu temel çizgiye göre ölçülür.
Uygulama LSTM toplayıcı
Toplayici sınıfını yaz: nn.LSTM(1, 32, batch_first=True) ve son gizli durumdan nn.Linear(32, 1). Tüm veride Adam(lr=0.01) ve MSELoss ile 300 adım eğit. Eğitim öncesi MSE'nin 5'ten büyük, sonrası MSE'nin 0.5'ten küçük olduğunu aynı satırda yazdır.
Başlangıç kodu
import torch
from torch import nn
torch.manual_seed(0)
X = torch.randn(512, 12, 1)
y = X.sum(dim=1)
# buraya yazÖrnek çözüm
import torch
from torch import nn
torch.manual_seed(0)
X = torch.randn(512, 12, 1)
y = X.sum(dim=1)
class Toplayici(nn.Module):
def __init__(self):
super().__init__()
self.lstm = nn.LSTM(1, 32, batch_first=True)
self.bas = nn.Linear(32, 1)
def forward(self, x):
_, (h_n, _) = self.lstm(x)
return self.bas(h_n[-1])
model = Toplayici()
mse = nn.MSELoss()
with torch.no_grad():
once = mse(model(X), y).item()
opt = torch.optim.Adam(model.parameters(), lr=0.01)
for _ in range(300):
opt.zero_grad()
kayip = mse(model(X), y)
kayip.backward()
opt.step()
print(once > 5, kayip.item() < 0.5)Beklenen çıktı
True True
Uygulama Daha uzun dizilere genelleme
Eğitilmiş bir toplayıcıyı taklit etmek için verilen modeli 300 adım eğit (kod hazır). Ardından eğitimde hiç görülmemiş 24 adımlık dizilerde (torch.randn(256, 24, 1)) MSE'yi ölç; MSE'nin sıfır tahmini temelinden (24) küçük olduğunu yazdır.
Başlangıç kodu
import torch
from torch import nn
torch.manual_seed(0)
X = torch.randn(512, 12, 1)
y = X.sum(dim=1)
lstm = nn.LSTM(1, 32, batch_first=True)
bas = nn.Linear(32, 1)
model = lambda x: bas(lstm(x)[1][0][-1])
opt = torch.optim.Adam(list(lstm.parameters()) + list(bas.parameters()), lr=0.01)
for _ in range(300):
opt.zero_grad()
nn.functional.mse_loss(model(X), y).backward()
opt.step()
# buraya yazÖrnek çözüm
import torch
from torch import nn
torch.manual_seed(0)
X = torch.randn(512, 12, 1)
y = X.sum(dim=1)
lstm = nn.LSTM(1, 32, batch_first=True)
bas = nn.Linear(32, 1)
model = lambda x: bas(lstm(x)[1][0][-1])
opt = torch.optim.Adam(list(lstm.parameters()) + list(bas.parameters()), lr=0.01)
for _ in range(300):
opt.zero_grad()
nn.functional.mse_loss(model(X), y).backward()
opt.step()
X_uzun = torch.randn(256, 24, 1)
y_uzun = X_uzun.sum(dim=1)
with torch.no_grad():
hata = nn.functional.mse_loss(model(X_uzun), y_uzun).item()
print(hata < 24)Beklenen çıktı
True
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Her zaman 0 tahmin eden modelin MSE'si neden yaklaşık 12'dir?
- Gizli boyuttan
- Değildir
- 12 bağımsız standart normal sayının toplamının varyansı 12'dir Doğru cevap
- Dizi 12 adımlıdır, rastlantı
Açıklama: Bağımsız değişkenlerin varyansları toplanır; ortalama 0 olduğu için MSE = varyans.
2 Dizi ekseni boyunca topla.
y = X.sum(____=1)
y = X.sum(dim=1)
Açıklama: dim=1 zaman eksenidir (batch_first=True).
3 Parçaları eşleştir.
| Kavram | Anlamı |
|---|---|
(512, 12, 1) |
Girdi dizileri |
(512, 1) |
Hedef toplam |
MSE ≈ 12 |
Sıfır tahmini temeli |
h_n[-1] |
Birikimin özeti |