Понимание простой 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. Я не знаю, понимаю следующие вещи:
- Что такое выходной размер и почему он нигде не указан?
- Почему входные данные имеют 3 измерения. Что представляют собой 5 и 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 тензоры в
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
И
Comments