2017-08-22 8 views
9

の形がthis LSTM Autoencoderの場合、"test.py"は(128,8,1)です。 8桁の128組を意味する。私は、このモデルを時系列ベースのデータに合わせて、4セットの25,000時間ステップ(基本的には0秒から25,000秒)で適応しようとしています。このデータセットを形状(4,25000,1)のp_inputに入力しようとしましたが、エラーは発生しませんでした。しかし、私がスクリプトを実行すると、iter 1: 0.01727, iter 2: 0.00983, ...を得るのではなく、私はスクリプトからの印刷されたフィードバックを得られないので、何かがスクリプトを保持していると仮定します。私はbatch_numを4に、step_numを25000に編集していない "test.py"ファイルに直接変更しようとしましたが、印刷されたフィードバックのない同じ結果が発生しました。スクリプトが大規模なデータセットで実行されているときにLSTMオートエンコーダが進行しない

「test.py」のp_inputsは、tf.splittf.squeeze操作を計算するのには時間がかかりすぎます。もう一つの考えは、隠しLSTMユニットの数をhidden_numに増やしたり、エポック数を増やす必要があるかもしれないということです(iteration)。さらに、batch_numstep_numより大きくなければならない可能性があります。私はstep_num = 4batch_num = 25000で "test.py"を試してみましたが、このスクリプトは正常に動作していました。

スクリプトの実行を保留する際に問題が発生する可能性があることについて、ご意見をお聞かせください。

答えて

4

入力の2番目の次元は、BPTTアルゴリズムによってネットワークが計算勾配のために展開される回数です。

アイデアは、(LSTMのような)反復的なネットワークが、ネットワークの新しい層として各タイムステップを「アンロール」することによってフィードフォワードネットワークに変換されるという考えです。

タイムシリーズ全体(つまり25000タイムステップ)を指定すると、ネットワークを25000回アンロールすると、25000レイヤのフィードフォワードネットワークが作成されます。

だから私はなぜあなたがエラーを出さないのか分からなくても、おそらく問題はOUT OF MEMORYの問題に関係しているでしょう。メモリに25000のレイヤー変数を収めることはできません。

長い時間系列を処理する必要がある場合は、データを複数の塊に分割する必要があります(20のタイムステップを言います)。 1回の実行につき1つのチャンクを提供します。その後、次の各実行時に、以前の実行の最後の状態でネットワークの初期状態を復元する必要があります。

私はあなたに例を挙げることができます。あなたは今、これらのようなチャンクに分割する必要が

--------------------- 25000---------------------- 
| 
| 
4 
| 
| 
-------------------------------------------------- 

:あなたは(私は実用的な理由のための第三の次元を無視)今持っていることは、このような何かを形作っているベクトル4x25000である

----20----- ----20----- ----20----- 
|   | |   | |   | 
|   | |   | |   | 
4   | 4   | 4   | [...] 
|   | |   | |   | 
|   | |   | |   | 
----------- ----------- ----------- 

毎回4x20の単一チャンクを提供します。次に、各チャック後のLSTMの最終状態を次のチャックの入力として提供する必要があります。

だからあなたfeed_dictは次のようなものでなければなりません:

feed_dict ={x: input_4_20}, 
      state.c = previous_state.c, 
      state.h=previous_state.h} 

次の実行にLSTMの状態を提供する方法については、たとえばTensorflowのLM tutorialを参照してください。

Tensorflowには、これを自動的に行うための機能がいくつか用意されています。詳細については、RNN APIのTensorflow DevSummit Tutorialを確認してください。私は、目的の機能が説明されている正確な秒をリンクしました。機能は、tf.contrib.training.batch_sequences_with_states(...)

最後のアドバイスとして、私はあなたの仕事で再考することをお勧めします。実際、25000の時系列は本当に長いシーケンスであり、LSTMでさえそのような長い過去の依存関係を管理できないという事実が心配です。私が意味するのは、シリーズの24000番目の要素を処理しているとき、LSTM状態はおそらく第1要素に関するすべてを忘れていたということです。このような場合は、データを見て、どれが現象のスケールであるかを確認してみてください。 1秒単位の細かさが必要ない場合(つまり、機能が時間的に非常に急激に変化しないためにシリーズが非常に冗長である場合)、シリーズを縮小して管理してください。

+0

ありがとうございます。 25,000のタイムステップは補間とポイント数の選択から来ます。私はいつもそれを変更することができます。タイムステップの最大数はどのようにすべきですか?また、すべてのリンクを読んだ後でも、チャンクをどうやってやっているのかは分かりません。 –

+0

私は答えを編集しました。それが明確であるかどうか教えてください。タイムステップの最大数に関係するものは、ニーズに応じて異なります。 LSTMは過去にかなり依存していた依存関係を学習することができますが、私の経験では、100回のステップを上回ることは良くありません。 1つの入力として、時間ディメンションで長すぎるチャンクを超えないようにしてください(20〜50を保つ方が良い) –

関連する問題