Sequence
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 49/78
- 5 dk
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ımlarPaketleme 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.
Başlangıç kodu
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])]
# buraya yazÖrnek çözüm
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())Beklenen çıktı
[[3, 1, 4, 0], [1, 5, 0, 0], [9, 2, 6, 5]] [4, 5, 5]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
Açıklama: Kısa dizinin gerçek son adımı uzunluk - 1 konumundadır.
2 Dizileri aynı uzunluğa getir.
X = ____(diziler, batch_first=True)
X = pad_sequence(diziler, batch_first=True)
Açıklama: pad_sequence en uzun diziye göre sıfırla doldurur.
3 Araçları eşleştir.
| Kavram | Anlamı |
|---|---|
pad_sequence |
Dolgu ekler |
uzunluk |
Gerçek adım sayısı |
pack_padded_sequence |
Dolguyu işlemez |
padding_value=0 |
Dolgu indeksi |