Makine Öğrenmesi
Sequence
RNN, dizi boyunca adım adım ilerler ve her adımda hidden state günceller.
Dizi
Bir toplu verideki dizilerin uzunlukları genellikle farklıdır. Hepsi aynı uzunluğa dolgu (padding) ile getirilir; model dolgu adımlarını yok sayabilsin diye gerçek uzunluklar da saklanır:
from torch.nn.utils.rnn import pad_sequence
diziler = [torch.tensor([3, 1, 4]), torch.tensor([1, 5]), torch.tensor([9, 2, 6, 5])]
X = pad_sequence(diziler, batch_first=True, padding_value=0)
print(X.tolist()) # [[3, 1, 4, 0], [1, 5, 0, 0], [9, 2, 6, 5]]
uzunluk = torch.tensor([len(d) for d in diziler])
Metin için sayılar kelime indeksleridir; 0 genellikle dolgu için ayrılır.
Son gerçek adımı seçmek
Her dizinin son gerçek adımının çıktısı gelişmiş indekslemeyle alınır. Alternatif olarak pack_padded_sequence RNN'in dolgu adımlarını hiç işlememesini sağlar:
output, _ = rnn(gomulu) # (N, T, H)
son = output[torch.arange(len(uzunluk)), uzunluk - 1] # (N, H)
from torch.nn.utils.rnn import pack_padded_sequence
paket = pack_padded_sequence(gomulu, uzunluk, batch_first=True, enforce_sorted=False)
_, h_n = rnn(paket) # h_n gerçek son adımlar
Paketleme hem doğruluk hem hız kazandırır; dolgu adımları hesaplanmaz.
Uygulama Dolgu ve uzunluk
Verilen üç diziyi pad_sequence(..., batch_first=True) ile doldur ve tolist() ile yazdır. Uzunlukları bir tensörde topla; her dizinin son gerçek elemanını X[torch.arange(3), uzunluk - 1] ile seçip tolist() ile yazdır.
Örnek çözümü göster
import torch
from torch import nn
from torch.nn.utils.rnn import pad_sequence
diziler = [torch.tensor([3, 1, 4]), torch.tensor([1, 5]), torch.tensor([9, 2, 6, 5])]
X = pad_sequence(diziler, batch_first=True)
print(X.tolist())
uzunluk = torch.tensor([len(d) for d in diziler])
print(X[torch.arange(3), uzunluk - 1].tolist())
Kendini test et
-
Dolgulu dizide son gerçek adımın çıktısı neden <code>output[:, -1]</code> değildir?
- Her zaman öyledir
- RNN sondan başlar
- Çıktı yoktur
- Kısa dizilerde son konum dolgudur
Cevabı göster
Kısa dizilerde son konum dolgudur — Kısa dizinin gerçek son adımı uzunluk - 1 konumundadır.
-
Dizileri aynı uzunluğa getir.
X = ____(diziler, batch_first=True)
Cevabı göster
X = pad_sequence(diziler, batch_first=True)
-
Araçları eşleştir.
- pad_sequence
- Dolgu ekler
- uzunluk
- Gerçek adım sayısı
- pack_padded_sequence
- Dolguyu işlemez
- padding_value=0
- Dolgu indeksi
Sıradaki ders: Vanishing gradient