CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2

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

model.py
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

model.py
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

model.py
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

model.py
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.

Soru
y = X.sum(____=1)
Cevap
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

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