問題タブ [lstm-stateful]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
keras - Dense は 2d を想定していますが、LSTM では 3d を取得しています
私のモデルでは
モデルを構築するときは、
合わせようとすると、エラーがスローされます。
100 個のフィーチャすべてについて、次の 1 つのタイム スタンプを予測する必要があります。どのような変更を行う必要がありますか?
keras - 最終密層を使用する場合と使用しない場合の多対多のステートフル LSTM のトレーニング
回帰目的で LSTM を含む Keras で反復モデルをトレーニングしようとしています。モデルをオンラインで使用したいのですが、私が理解している限り、ステートフルな LSTM をトレーニングする必要があります。モデルは一連の値を出力する必要があるため、期待される出力ベクトルのそれぞれについて損失を計算できることを願っています。ただし、私のコードがこのように機能していないのではないかと心配しており、誰かが私が正しいことをしているかどうか、またはより良いアプローチがあるかどうかを理解するのを手伝ってくれれば幸いです.
モデルへの入力は、128 次元のベクトルのシーケンスです。トレーニング セット内の各シーケンスの長さは異なります。毎回、モデルは 3 要素のベクトルを出力する必要があります。
2 つのモデルをトレーニングして比較しようとしています。A) 128 の入力と 3 つの出力を持つ単純な LSTM。B) 128 の入力と 100 の出力を持つ単純な LSTM + 3 つの出力を持つ密な層。
モデル A) の場合、次のコードを書きました。
このコードでは、出力シーケンスがトレーニング セットのグラウンド トゥルース シーケンスに近づくため、モデル A) は正常にトレーニングされているように見えます。しかし、すべての NTimes 出力ベクトルを考慮して損失が本当に計算されているのだろうか。
モデル B) の場合、レイヤーが密集しているため、出力シーケンス全体を取得する方法が見つかりませんでした。したがって、私は書いた:
このコードでは、モデル B) は正常にトレーニングされません。トレーニングが収束せず、損失値が周期的に増減するように思えます。また、最後のベクトルのみを Y として使用し、トレーニング シーケンス全体 X でフィット関数を呼び出してみましたが、改善はありませんでした。
何か案が?ありがとうございました!
python - Keras の共有 LSTM レイヤーでの状態永続性
Keras モデルで状態を共有する LSTM 層を使用しようとしていますが、並列使用ごとに内部状態が変更されているようです。これにより、次の 2 つの疑問が生じます。
- 共有 LSTM レイヤーを使用してモデルをトレーニングする場合
stateful=True
、並列使用はトレーニング中にも同じ状態を更新しますか? - 私の観察が有効な場合、並列使用ごとに状態が個別に保存されるように、重み共有 LSTM を使用する方法はありますか?
以下のコードは、LSTM を共有する 3 つのシーケンスの問題を示しています。完全な入力の予測は、予測入力を 2 つの半分に分割し、それらをネットワークに連続して供給した結果と比較されます。
観察できることは、 がa1
の前半と同じであるaFull
ことです。つまり、LSTM の使用は、最初の予測中に独立した状態と実際に並行していることを意味します。つまり、andz1
を作成する並列呼び出しの影響を受けません。しかし、 の後半とは異なるため、並列使用の状態間に何らかの相互作用があります。z2
z3
a2
aFull
私が望んでいたのは、2 つの部分の連結が、より長い入力シーケンスで予測を呼び出した結果と同じa1
にa2
なることですが、そうではないようです。さらなる懸念は、この種の相互作用が予測で発生する場合、トレーニング中にも発生するかどうかです。
更新: 上記の動作は、Tensorflow 1.14 および 1.15 をバックエンドとして使用する Keras で観察されました。同じコードを tf2.0 で (インポートを調整して) 実行すると、結果が変わり、a1
の前半と同じではなくなりaFull
ます。stateful=False
これは、レイヤーのインスタンス化を設定することで実現できます。
これは、再帰レイヤーを共有パラメーターで使用しようとしているが、並列使用のための独自の状態を使用しようとしている方法は、このように実際には不可能であることを示唆しています。
更新 2 : 同じ機能が以前の他のものでも見逃されているようです: Keras の github でのクローズされた未回答の質問。
比較のために、重みを共有するが独立した状態を持つ N 個の並列 LSTM を持つ単純なネットワークを実装する pytorch (私が初めて使用しようとした) の走り書きを次に示します。この場合、状態は明示的にリストに格納され、手動で LSTM セルに提供されます。
結果: 予測を一度に行うか分割して行うかに関係なく、出力は同じです。
サブクラス化を使用して Keras でこれを複製しようとしましたが、成功しませんでした:
「トーチを使用して黙ってみませんか?」と尋ねると、答えは、周囲の実験的なフレームワークが Keras を想定して構築されており、それを変更することは無視できない量の作業になるということです。
machine-learning - RNN/LSTM を使用した速度の変化の検出 (現在の xy 位置を指定)
連続データの x、y 座標が与えられた場合、RNN/LSTM を使用して速度の変化を学習するにはどうすればよいですか? (これは、他のことも行うより大きなエンドツーエンドモデルのサブ問題であるため、再帰レイヤーを使用する必要があります)
トレーニング データの例:
これまでのところ、ステートフル LSTM を構築し、バッチごとに 1 つの項目でトレーニングしました。その後、速度が変化するたびに LSTM の状態をリセットするので、セグメントの速度が同じであることがわかります (セグメントの長さは異なる場合があります)。
セグメントの長さが異なるため、そのようなモデルを本番環境で使用するにはどうすればよいですか?
または、そのようなデータで再帰ネットをトレーニングするより良い方法はありますか? もしかして異常発見?(バッチサイズを固定するのは避けたい (例: 3 フレームのウィンドウ))