0.成功と失敗
学習前を介して2件の記事LSTMを構築する方法とどのようにLSTM入力と出力の形式を理解するために、我々はLSTMを訓練する方法を学習するために基礎としてそれから。
1. LSTMの構造を定義する
rnn = torch.nn.LSTM(30, 1, 2, batch_first=True) #(input_size,hidden_size,num_layers)
input = train_y #(seq_len, batch, input_size)
h0 = torch.randn(2, 193, 1) #(num_layers,batch,hidden_size)
c0 = torch.randn(2, 193, 1) #(num_layers,batch,hidden_size)
rnn = torch.nn.LSTM(30, 1, 2, batch_first=True)
本明細書でこのLSTMのいくつかのパラメータを定義:
入力データのサイズは、すなわち、30でありますinput_size = 10つまり、サイクルごとにサイズ30のデータベクトルが入力され、
隠れ層のサイズは1、つまりhidden_size = 1
LSTMレイヤーの数は2、つまりnum_layers = 2
入力形状は元々(seq_len、batch、input_size)でしたが、設定された場合batch_first =真入力形状が(batch、seq_len、input_size)になると、出力形状も(seq_len、batch、num_directions hidden_size)から(batch、seq_len、num_directions hidden_size)に変わります
input = train_y #(seq_len, batch, input_size)
テンソル入力を入力は((seq_len、バッチ、input_size)に応じて割り当てられた後、形状を整列する
場合seq_len *バッチ* input_size =入力要素の総数
次に、それを使用するときに発生する2つの入力状況に基づいて分析します。
(1)元の入力が1次元データである場合、たとえば、株式を予測する場合、元の入力は、日数による日次の最大株価の変化です。この時点での元の入力は1次元です。
このとき、最初のステップでは、通常、この1次元データを2次元データに変換します。たとえば、
最も元の1次元データ:
[10.52 14.62 5.48 9.35 3.91 9.35 3.91 14.62 14.62 3.91
7.05 5.48 3.91 7.05 10.52 10.52 14.62 10.52 7.05 14.62 ]
各10を2次元テンソルにグループ化します。
この変換後、データの各行はターゲット値に対応します。つまり、LSTMは10の連続するシーケンス値に基づいてターゲット値を学習します。
ただし、LSTMの入力値には3次元テンソル(seq_len、batch、input_size)が必要ですが、このとき、上記の2次元テンソルを再構築して3次元テンソルにする必要もあります。(再構築法はテンソル演算を指します)
ここでseq_len = 11;input_size = 10;バッチ操作とは、いくつかのフォワード計算を実行してから、重み付けを更新するためにリバース計算を実行することです。20データは2次元データになってから11行になるため、上記のデータを使用します。 、たとえば、バッチ= 3、次に、上記の2次元テンソルの3行ごとに重みが更新され、最後の2行が計算されてから重みが更新されますが、前のseq_len = 11、input_size = 10だからバッチ= 1(より深い理解のために、LSTMの入出力フォーマットを理解する方法を参照してください)
(2)元の入力が2次元データである場合、たとえば、文の単語に対して品詞認識を実行する場合、属性ベクトルを使用して単語を記述するため、最も元の入力文は2次元マトリックスに。
例:
最も元のデータ
data_ = [[1, 10, 11, 15, 9, 100],
[2, 11, 12, 16, 9, 100],
[3, 12, 13, 17, 9, 100],
[4, 13, 14, 18, 9, 100],
[5, 14, 15, 19, 9, 100],
[6, 15, 16, 10, 9, 100],
[7, 15, 16, 10, 9, 100],
[8, 15, 16, 10, 9, 100],
[9, 15, 16, 10, 9, 100],
[10, 15, 16, 10, 9, 100]]
ここの各行は単語を表しています。これはテンソルとして3に再構成する必要があります。このとき、次のような入力構造値を設定できます。seq_len = 2、batch = 5、input_size = 6
最初のバッチが次の場合:
tensor([[ 1., 10., 11., 15., 9., 100.],
[ 2., 11., 12., 16., 9., 100.]]
最後のバッチは次のとおりです。
tensor([[ 9., 15., 16., 10., 9., 100.],
[ 10., 15., 16., 10., 9., 100.]])
どこにバッチ= 2バッチ操作とは、いくつかのフォワード計算を実行し、次にリバース計算を実行して重みを更新することを意味します
h0 = torch.randn(2, 193, 1) #(num_layers,batch,hidden_size)
ここにhidden_sizeあなたが望むものに応じて出力たとえば、出力を1次元のベクトルにしたい場合、hidden_size = 1、出力を2次元行列にする場合は、hidden_sizeこの行列の2番目の次元のサイズです。たとえば、出力が3 * 5の場合、hidden_size = 5。
c0 = torch.randn(2, 193, 1) #(num_layers,batch,hidden_size)
c0とh0まったく同じです
2.フォワード計算
output, (hn, cn) = rnn(input, (h0, c0))
3.オプティマイザと損失関数を選択します
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all cnn parameters
loss_func = nn.MSELoss()
4.パラメータを更新するための複数の前方および後方計算
for step in range(EPOCH):
output,(hn, cn)= rnn(input,(h0, c0))
loss = loss_func(output, train_target_nom)
optimizer.zero_grad() # clear gradients for this training step
loss.backward() # back propagation, compute gradients
optimizer.step()
5.出力を目的の形式に変換します
出力は3次元のテンソルですが、最終的にこのタイプの結果を必ずしも必要としないため、変換する必要があります。
たとえば、2次元の出力になります。
output=output.view(193,-1)