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の例です。次のことを理解していない:
編集:
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テンソルが取得されました
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):各tについて、RNNの最後のレイヤーからの出力フィーチャ(h_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)))
注:この答えについては、非双方向LSTMについてのみ話していると仮定しました。
ソース: PyTorch docs 。
Cdo256による回答はほぼ正しいです。 hidden_sizeの意味を参照するとき、彼は間違っています。彼はそれを次のように説明しています:
hidden_size-レイヤーごとのLSTMブロックの数。
しかし、実際には、より良い説明があります:
セル内の各シグモイド、tanh、または非表示状態のレイヤーは、実際にはノードのセットであり、その数は非表示レイヤーのサイズに等しくなります。したがって、LSTMセル内の各「ノード」は、密に接続されたニューラルネットワークの各層のように、実際には通常のニューラルネットワークノードのクラスターです。したがって、hidden_size = 10に設定すると、各LSTMブロックまたはセルには、10個のノードを持つニューラルネットワークが含まれます。 LSTMモデルのLSTMブロックの総数は、シーケンスの長さと同じになります。
これは、nn.LSTMとnn.LSTMCellの例の違いを分析することで確認できます。
https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM
そして
設定できます
batch_first = True
入力および出力を次のように提供する場合
(batch_size、seq、input_size)
今日それを知ったので、あなたと共有します。