Понимание простой LSTM pytorch



import torch,ipdb
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable

rnn = nn.LSTM(input_size=10, hidden_size=20, num_layers=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))


Это пример LSTM из docs. Я не знаю, понимаю следующие вещи:




  1. Что такое выходной размер и почему он нигде не указан?

  2. Почему входные данные имеют 3 измерения. Что представляют собой 5 и 3?

  3. Что такое 2 и 3 в h0 и c0, что они представляют?


Правка:



import torch,ipdb
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
import torch.nn.functional as F

num_layers=3
num_hyperparams=4
batch = 1
hidden_size = 20
rnn = nn.LSTM(input_size=num_hyperparams, hidden_size=hidden_size, num_layers=num_layers)

input = Variable(torch.randn(1, batch, num_hyperparams)) # (seq_len, batch, input_size)
h0 = Variable(torch.randn(num_layers, batch, hidden_size)) # (num_layers, batch, hidden_size)
c0 = Variable(torch.randn(num_layers, batch, hidden_size))
output, hn = rnn(input, (h0, c0))
affine1 = nn.Linear(hidden_size, num_hyperparams)

ipdb.set_trace()
print output.size()
print h0.size()



*** RuntimeError: матрицы ожидаются, получены 3D, 2D тензоры в


634   3  

3 ответов:

Выходные данные для LSTM-это выходные данные для всех скрытых узлов на конечном слое.
hidden_size - Количество блоков LSTM на слой.
input_size - количество входных объектов на каждом временном шаге.
num_layers - количество скрытых слоев.
Всего существует hidden_size * num_layers блоков LSTM.

Входные измерения - (seq_len, batch, input_size).
seq_len - число временных шагов в каждом входном потоке.
batch - Размер каждой партии входных последовательностей.

Скрытое и клеточное измерения являются: (num_layers, batch, hidden_size)

Output (seq_len, batch, hidden_size * num_directions): тензор, содержащий выходные объекты (h_t) из последнего слоя RNN для каждого t.

Так что будут hidden_size * num_directions выходы. Вы не инициализировали RNN, чтобы быть двунаправленным, поэтому num_directions равно 1. Итак output_size = hidden_size.

Edit : Вы можете изменить количество выходов с помощью линейного слоя:

out_rnn, hn = rnn(input, (h0, c0))
lin = nn.Linear(hidden_size, output_size)
v1 = nn.View(seq_len*batch, hidden_size)
v2 = nn.View(seq_len, batch, output_size)
output = v2(lin(v1(out_rnn)))

Примечание : для этого ответа я предположил, что мы говорим только о не двунаправленные Лстм.

Источник: PyTorch docs.

Можно задать

Batch_first = True

Если вы хотите, чтобы входные и выходные данные предоставлялись как

(batch_size, seq, input_size)

Я знаю это сегодня, поделюсь с вами.

Ответ cdo256 почти верен. Он ошибается, когда говорит о том, что означает hidden_size. Он объясняет это так:

Hidden_size-количество блоков LSTM на слой.

Но на самом деле, вот лучшее объяснение:

Каждый сигмовидный, танх или скрытый слой состояния в ячейке фактически представляет собой набор узлов, число которых равно размеру скрытого слоя. Поэтому каждый из "узлов" в ячейке LSTM фактически является кластером нормальных узлов нейронной сети, так как в каждом слое плотно связанная нейронная сеть. Следовательно, если вы установите hidden_size = 10, то каждый из ваших блоков LSTM, или ячеек, будет иметь нейронные сети с 10 узлами в них. Общее число блоков LSTM в вашей модели LSTM будет эквивалентно длине вашей последовательности.

Это можно увидеть, проанализировав различия в примерах между nn.ЛСТМ и nn.LSTMCell:

Https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM

И

Https://pytorch.org/docs/stable/nn.html#torch.nn.LSTMCell

Comments

    Ничего не найдено.