CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

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

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

Soru
X = ____(diziler, batch_first=True)
Cevap
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

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