pytorch ケース コード 2

Recurrent Neural Network - 基礎知識は、
天気予報、株式市場の予測、自然言語など、前後のつながりのある連続的なデータ予測に適しており、これらの計算は DNN や CNN では大きすぎるか不可能です.h0 は先験的, 前に CNN+FC を接続し、後ろに RNN を接続して画像からテキストへの変換を完了することもできます. 事前がない場合は、h0 を h1 と同じ次元のすべての 0 に設定することもできます.
RNN セルが共有されていることに注意してください. すべての RNN セルは同じ線形 (線形層) です. xi の n 次元は hi の m 次元にマッピングされます. この線形は循環的に使用されるため, 循環ニューラルと呼ばれます.通信網。hi は時刻 i での xi の出力結果であり、時刻 xi+1 での入力でもあります。
写真の説明を追加してください
Cell 演算は以下のとおり. 入力 xt の次元は input_size × 1. ht-1 に追加する必要があるため、hidden_​​size 次元に変換されます. Wih は hidden_​​size × input_size, Whh は hidden_​​size × hidden_​​size . バイアスを追加すると、結果として得られる 2 つのベクトルが直接 (情報融合) tanh 活性化 (これは RNN で一般的に使用されます) に追加され、ht が得られます。
実際には、これら 2 つの操作は一緒です。W1 × h + W2 × x は [W1 W2] × [hx]^T に変換できるため、実際には、x と h を組み合わせて (hidden_​​size+input_size) × を取得します。 1 ベクトルおよび hidden_​​size × (hidden_​​size+input_size) の重み行列演算。したがって、基本的には線形レイヤーです。

写真の説明を追加してください
RNN セルは pytorch でそれ自体で定義できます。以下に示すように、組み込みを使用することもできます。input と hidden にはそれぞれ 2 つのパラメーターがあります。1 つ目はサンプル数を表すバッチで、2 つ目はディメンションです。
写真の説明を追加してください
以下に示すように、batch_size はサンプルの数を表し、seqLen は各サンプルが持つシーケンスの数を表します. たとえば、この場合、各サンプルには x1 x2 x3 の 3 つの 4 次元シーケンスが含まれます.
写真の説明を追加してください




Recurrent Neural Network——Recurrent Neural Network の使い方
上記の基礎知識があれば、RNN を使用できます.RNN はサイクルを自分で書く必要がなく、自動的に計算します。RNN にとって最も重要で基本的なことは、各パラメーターのサイズを理解することです。
RNN を使用すると、層の数を示す追加の num_layers パラメータがあります. 下の 2 番目の図は、3 層の RNN を示しています (層が多いほど計算に時間がかかります). 複雑に見えますが、線形層の重みは 3 つしかありません. .
RNN の入力パラメーターの場合、入力には入力シーケンス全体 (x1-xn) が含まれている必要があり、hidden は h0 です (3 つのレイヤーがある場合は、残りの 3 つの h0 です)。
2 つの出力テンソル パラメーターのうち、最初の out は h1-hn を表し、2 番目のパラメーター hidden は hn を表します (レイヤーが 3 つある場合は、右側の 3 つの hn です)。
写真の説明を追加してください
写真の説明を追加してください

コードを書くときはパラメーターの構成に注意してください:写真の説明を追加してください
ヒント: データセットの構成を容易にするために、RNN にはパラメーター batch_first も用意されています. True に設定すると、batch_size と seq_len パラメーターの位置が入れ替わります. その他変更なし
写真の説明を追加してください



リカレント ニューラル ネットワーク - RNNCell を使用した例
入力 hello シーケンスと出力 ohlo シーケンスを学習する簡単な例。ただし、これらの文字ネットワークは計算できないため、nlp でベクトル化するのが一般的です. 一般的な方法は、文字辞書を構築することです. 単語レベルであれば、単語辞書です. 図 2 に示すように、ここで各文字にインデックスが割り当てられます (ランダムに割り当てることができます。一意にしておくだけです)。次に、インデックスの添え字によってワンホット ベクトルが生成されます。つまり、インデックスの添え字のみが 1 です。その他は 0 で、ベクトルの次元は辞書要素の数です。ここでは 4 であるため、input_size は 4 です。
出力で helo が出力している 4 文字のカテゴリを知らせたいので、出力のサイズ (hidden_​​size) も 4 です。
写真の説明を追加してください
写真の説明を追加してください
トレーニングに使用されるサンプルは 1 つだけなので、batch_size は 1 です。次に、インデックスに従って文字を取得できるように、まず辞書、つまり文字リストを作成します。x_data は hello に対応し、y_data は ohlol に対応します。
次に、単純なクエリ ステートメントを使用して、入力データのワンホット ベクトルを作成します. たとえば、入力データの 2 番目の文字インデックスは 0 に対応し、0 行目のデータが対応するベクトルとして取り出されるため、入力データのワンホット ベクトルのサイズは (seq_len , input_size) です。入力の途中に batch_size があるため、それを表示し、最終的に (seq_len, batch_size, input_size) のサイズを維持し、さらにラベルを (seq_len, 1) の次元に変形します。
ここで, 入力と forward の入力の区別に注意. ここで, input のサイズは (batch_size, input_size). トレーニング中は入力から各入力を取り出す, つまり各 xt. ここで, forward とは各 ht = cell(xt , ht-1) を計算します。
図 3 の 3 番目の関数は、最初のテスト用にデフォルトの h0 を生成することです。ここでは、すべて 0 が生成されます。サイズは、ht や xt などの入力の次元です。ここでは、渡されたbatch_sizeパラメータのみが使用されていることがわかります.実際には、このパラメータは渡されていません.このパラメータは、入力の形状から取得することもできます.

写真の説明を追加してください
写真の説明を追加してください
写真の説明を追加してください

モデルを構築したら、トレーニングできます. このサンプルを 15 ラウンドのトレーニングに使用します. トレーニングの各ラウンドで、h0 を init_hidden で初期化することを忘れないでください。トレーニングのために各 xt を取り出します。入力サイズは (batch_size, input_size)、入力は (seq_len、batch_size、input_size)、ラベルは (seq_len, 1)、ラベルは (1) です。 1つずつ累積され
、シーケンス全体の損失を合計して計算グラフを作成します。
for ループの最後の 2 行のコードは予測を出力します。hidden は各文字の予測確率を表す 4 次元ベクトルであり、(batch_size, input_size) 次元であるため、dim1 を押すと、つまり、ht 対応する文字を出力する最大の添え字を見つけることです。
最終的に、損失が減少し続け、最終結果が正しいことがわかります。
写真の説明を追加してください
ここに画像の説明を挿入
写真の説明を追加してください



Recurrent Neural Network - The example uses RNN
or the above example. RNN を使用する場合、独自のサイクル計算を記述する必要はありません。
ここで、隠れ層 h0 は forward で構築されるか、外部で構築されて forward に渡されます。ここでの forward の入力は入力全体であるため、(seq_len, batch_size, input_size) であり、hidden の次元は (num_layers, batch_size, hidden_​​size) です。というわけで概要ですが、利点はクロスエントロピーを計算する際に二次元行列に変換する必要があり、ラベルも(seq_len, batch_size, 1)から(seq_len×batch_size, 1)に変更する必要があることです。
写真の説明を追加してください
写真の説明を追加してください
トレーニングステップでは、ループを記述する必要はなく、入力全体が一度に渡されます. 下部のコードは、予測を出力するためのものでもあります.
ここでの小さな問題は、損失関数が ((seq_len×batch_size, hidden_​​size)) および (seq_len×batch_size, 1) である出力とラベルで渡されることです (実際、pycharm テストの後、ラベルはtorch.Size([5])、出力は torch.Size([5, 4])) ですが、hidden_​​size と 1 がどのように一致し、損失関数を見つけることができますか?
実際、torch.nn.CrossEntropyLoss(input, target) のラベル ターゲットはワンホット フォームを使用せず、カテゴリのシリアル番号を使用します。target = [1, 3, 2] の形式で、3 つのサンプルが第 1 カテゴリ、第 3 カテゴリ、および第 2 カテゴリに属する​​ことを意味します。入力: 予測値、(バッチ、dim)、dim は分類されるカテゴリの総数、出力の場合は (seq_len×batch_size、hidden_​​size); ターゲット: 実数値、(バッチ)、なぜ 1 なのかここで寸法?実際の値はワンホット形式で表現されるのではなく、カテゴリ ID に直接渡されるためです。
写真の説明を追加してください
写真の説明を追加してください



再帰型ニューラル ネットワーク — ワンホット ベクトル —> 埋め込みの
欠陥: 辞書に単語が格納されている場合、ワンホット ベクトルは数万の次元を持つ可能性があり、特にまばらであり、一種のハード コーディング (学習されていない) です。 .
以上のことから, 埋め込み層 EMBEDDING を使用すると,
写真の説明を追加してください
写真の説明を追加してください
次元を増減することができます. たとえば, ワンホットベクトルは 4 次元であり, これを 5 次元にアップグレードして, 下図に示す行列を作成します.たとえば、入力が 2 文字目の場合、2 行目に出てくるとします。
写真の説明を追加してください
するとネットワークは次のようになります. まず, 埋め込み層は入力ワンホットベクトルを密な形式に変換します. 埋め込み層は入力が長整数データであることを要求し, 最後に線形層があります.最終出力の隠し出力が と一致している必要があることを確認します 分類されたカテゴリの数は一致しています
写真の説明を追加してください
. 埋め込み層は主に2つのパラメータに焦点を当てています. 1つ目は入力データの次元 num_emdeddings です.これはワンホットの次元です.ベクトル, 2番目は出力次元embedding_dimです. これら2つは上記の行列の高さと幅を構成します. 埋め込みレイヤーの入力は長整数テンソルで, 出力のサイズは (*,embedding_dim), *は入力の形状、および * は任意の次元にすることができます。写真の説明を追加してください
写真の説明を追加してください
次に、線形層があります。
写真の説明を追加してください
次に、上記のクロスエントロピー、ターゲットは入力よりも 1 次元小さく、その後のデータは k 次元になる可能性があります。
写真の説明を追加してください



リカレント ニューラル ネットワーク—埋め込み層ネットワークの使用は
上記に基づいています. ネットワーク構造は, 埋め込み層と線形層を追加することです. 埋め込み層の入力データは長整数であり, サイズは (batch_size,入力データのサイズをこれに変更する必要があり、埋め込みレイヤーの出力は (batch_size、seqlen、embedding_size) になります。これは、スカラーから 1 への変換プロセスが既に処理されていることを意味します。 -hot ベクトルを内部的に使用するため、input_size、embedding_size、およびインデックス シーケンス x_data のみを指定する必要があります。
第二に、RNN の構造に注意してください.ここでは、batch_first を True に設定し、batch_size を seq_len の前に配置します.前後に配置しても問題ありませんが、このような使用法があることを知っておく必要があります。 .
次に、全結合層が hidden_​​size からカテゴリ数への変換を完了し、最終的にデータ ビューを 2 次元マトリックス (batch_size×seqlen、num_class) に出力して、損失計算に渡します。
出力は (batch_size×seqlen, num_class)、ターゲットまたはラベルは (batch_size×seqlen) です。
写真の説明を追加してください
写真の説明を追加してください
写真の説明を追加してください
写真の説明を追加してください
写真の説明を追加してください

おすすめ

転載: blog.csdn.net/weixin_43739821/article/details/128000547