web-dev-qa-db-ja.com

簡単な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

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の例です。次のことを理解していない:

  1. Output-sizeとは何ですか、またどこにも指定されないのはなぜですか?
  2. 入力に3つの次元があるのはなぜですか。 5と3は何を表していますか?
  3. H0とc0の2と3は何ですか、それらは何を表していますか?

編集:

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テンソルが取得されました

26
Abhishek Bhatia

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

28
cdo256

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

そして

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

8
Lsehovac

設定できます

batch_first = True

入力および出力を次のように提供する場合

(batch_size、seq、input_size)

今日それを知ったので、あなたと共有します。

2
zzuczy