LSTMのトレーニング方法

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 = 11input_size = 10;バッチ操作とは、いくつかのフォワード計算を実行してから、重み付けを更新するためにリバース計算を実行することです。20データは2次元データになってから11行になるため、上記のデータを使用します。 、たとえば、バッチ= 3、次に、上記の2次元テンソルの3行ごとに重みが更新され、最後の2行が計算されてから重みが更新されますが、前のseq_len = 11input_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)

c0h0まったく同じです

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)

リファレンス1
リファレンス2

公開された41件の元の記事 賞賛された13件 訪問6692

おすすめ

転載: blog.csdn.net/comli_cn/article/details/105299975