Ten release z PyTorch wydaje PackedSequence
dla zmiennej długości wejścia dla rekurencyjnej sieci neuronowej. Jednak okazało się, że jest to trochę trudne w użyciu.Jak poprawnie zaimplementować sieć LSTM do wprowadzania wsadowego w PyTorch?
Korzystanie pad_packed_sequence
odzyskać moc warstwą RNN które były karmione przez pack_padded_sequence
, mamy T x B x N
tensor outputs
gdzie T
jest max kroków czasowych, B
jest wielkość partii i N
jest ukryty rozmiar. Zauważyłem, że dla krótkich sekwencji w partii kolejne wyniki będą zerami.
Oto moje pytania.
- W przypadku pojedynczego zadania wyjściowego gdzie jeden musiałby ostatnie wyjście wszystkich sekwencji, prosty
outputs[-1]
daje zły wynik, ponieważ to tensor zawiera wiele zer dla krótkich sekwencji. Będzie trzeba skonstruować indeksy według długości sekwencji, aby pobrać ostatnie dane wyjściowe dla wszystkich sekwencji. Czy istnieje prostszy sposób na zrobienie tego? - dla zadania wielokrotnego wyjścia (np seq2seq), zazwyczaj jeden doda liniowej warstwy
N x O
i przekształcenia Wyjścia wsadowychT x B x O
doTB x O
i obliczyć przekrój straty entropii i rzeczywistych celów (zazwyczajTB
liczby całkowite w modelu Language). W tej sytuacji, czy te zera w wyjściach wsadowych mają znaczenie?
Staram swoje rozwiązanie i mam błąd: Plik "/root/PycharmProjects/skip-thoughts.torch/pytorch/tmpRNN.py", linia 13, w last_timestep powrotnej unpacked.gather (1, idx) .squeeze() Plik "/ usr/local/lib/python3.5/dist-packages/torch/autograd/variable.py ", linia 684, w zbiorach return Gather.apply (self, dim, index) RuntimeError: save_for_backward może tylko zapisać tensory wejściowe lub wyjściowe, ale argument 0 nie spełniają ten warunek – chenfei