Makine Öğrenmesi
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.
Örnek çözümü göster
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)
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.
Örnek çözümü göster
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)
Kendini test et
-
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
- Dizi 12 adımlıdır, rastlantı
Cevabı göster
12 bağımsız standart normal sayının toplamının varyansı 12'dir — Bağımsız değişkenlerin varyansları toplanır; ortalama 0 olduğu için MSE = varyans.
-
Dizi ekseni boyunca topla.
y = X.sum(____=1)
Cevabı göster
y = X.sum(dim=1)
-
Parçaları eşleştir.
- (512, 12, 1)
- Girdi dizileri
- (512, 1)
- Hedef toplam
- MSE ≈ 12
- Sıfır tahmini temeli
- h_n[-1]
- Birikimin özeti
Sıradaki ders: Meydan okuma 3