2017-05-23 54 views
5

W PyTorch możemy definiować architektury na wiele sposobów. Tutaj chciałbym stworzyć prostą sieć LSTM przy użyciu modułu Sequential.Proste LSTM w PyTorch z modułem sekwencyjnym

W palniku Lua ja zwykle iść z:

model = nn.Sequential() 
model:add(nn.SplitTable(1,2)) 
model:add(nn.Sequencer(nn.LSTM(inputSize, hiddenSize))) 
model:add(nn.SelectTable(-1)) -- last step of output sequence 
model:add(nn.Linear(hiddenSize, classes_n)) 

Jednak w PyTorch, nie znaleźliśmy równowartość SelectTable dostać ostatnią wyjście.

nn.Sequential(
    nn.LSTM(inputSize, hiddenSize, 1, batch_first=True), 
    # what to put here to retrieve last output of LSTM ?, 
    nn.Linear(hiddenSize, classe_n)) 

Odpowiedz

2

Według LSTM cell documentation wyjść parametr ma kształt (seq_len, partii, hidden_size * num_directions), dzięki czemu można łatwo wziąć ostatni element sekwencji w ten sposób:

rnn = nn.LSTM(10, 20, 2) 
input = Variable(torch.randn(5, 3, 10)) 
h0 = Variable(torch.randn(2, 3, 20)) 
c0 = Variable(torch.randn(2, 3, 20)) 
output, hn = rnn(input, (h0, c0)) 
print(output[-1]) # last element 

Manipulacja tensorami i projektowanie sieci neuronowych w PyTorch jest niesamowicie łatwiejsza niż w Latarce, więc rzadko trzeba używać pojemników. W rzeczywistości, jak stwierdzono w tutorialu PyTorch for former Torch users PyTorch jest zbudowany wokół Autogradu, więc nie musisz już martwić się o pojemniki. Jeśli jednak chcesz użyć swojego starego kodu Lua Torch, możesz rzucić okiem na Legacy package.

+0

Wcześniej dokładnie zakodowałem LSTM. Ale moje pytanie brzmi: jak zrobiłbyś to w ramach modułu sekwencyjnego 'nn.Sequential'? LSTM zwraca dwie wartości, 'output' i' hn' w twoim kodzie, jak odzyskać wyjście [-1] w stylu 'Sequential'? – BiBi

+0

Nie sądzę, że to uczciwe, aby ująć moją odpowiedź, ale zaktualizowałem ją, dodając więcej dowodów na to, że używanie pojemników, tak jak w Lua Torch, jest przestarzałe. –

+0

Zgodnie z [tym wpisem] (https://discuss.pytorch.org/t/accessing-intermediate-data-in-nn-sequential/637), chcieli pozbyć się modułu 'Sequential' w PyTorch, ale zachował ją dla wygody jako pojemnik. Domyślam się, że nie jest możliwy dostęp do pośredniego wyjścia w kontenerze 'Sequential'. – BiBi