2017-04-01 11 views
1

Android上で動作するTensorFlowネットワーク(graphdef)があります。推論の結果は時間とともに変化する傾向があります。つまり、ラベルAが返された場合、入力データがBラベルを生成するデータに切り替わった場合でも、時間的に後続するAのストリームになる傾向があります。最終的に結果はBに切り替わりますが、遅れがあるようで、推論呼び出しの間にRNNがステートフルであることを示唆しています。私たちのネットワークはRNN/LSTMを使用しています。TensorFlow:Androidでの推論間のRNNの状態を初期化します。

cellLSTM = tf.nn.rnn_cell.BasicLSTMCell(nHidden) 
cellsLSTM = tf.nn.rnn_cell.MultiRNNCell([cellLSTM] * 2) 
RNNout, RNNstates = tf.nn.rnn(cellsLSTM, Xin) 

私は推論の呼び出しの間RNNの状態を再初期化する必要がある場合、私は思ったんだけど。そのようなメソッドはTensorFlowInferenceInterface.javaインターフェイスで使用できないことに注意してください。私は、ノード値(FillNodeIntなどを使用)でアクティブ化できるグラフにRNNセル初期化ノードを挿入することが可能であると想像します。

私の質問は、TensorflowのRNN/LSTMのベストプラクティスです。推論の間に状態をクリアする必要がありますか?もしそうなら、それはどうやって行うのですか?

答えて

0

RNN状態の初期化の一般的な慣行についてはコメントできませんが、ここでは初期状態の定義を強制的に管理する方法について説明します。問題は、バッチサイズが実際にトレーニングセットの定数パラメータであったのに対し、テストセットではないことでした。テストセットは常にデータコーパスの20%なので、そのサイズはコーパスの変更ごとに異なります。 Xinサイズの入力テンソルbは、バッチサイズとm x nがトレーニングフレームのサイズである[BのXのM×N個]である

batch_size_T = tf.shape(Xin)[0] 


溶液はバッチサイズのための新しい変数を作成することでした。 Xinはfeed_dictから供給されます。

初期状態は、その後のように定義することができます。最後に、RNNは、新しい動的RNNの観点で定義されている

initial_state = lstm_cells.zero_state(batch_size_T, tf.float32) 

outputs, state = tf.nn.dynamic_rnn(cell=lstm_cells, inputs=Xin, dtype=tf.float32, initial_state=initial_state) 
0

推論の間に状態をクリアする必要がありますか?

RNNがどのように訓練され、どのように使用されているかによって異なります。しかし、私は、ネットワークが状態をリセットしてもリセットしなくてもうまく動作するだろうと推測します。

どのようにしますか?

初期状態に関連付けられた各テンソルの初期化操作を評価します。

+0

それどころか、のRNNがで前進状態を運ぶことができます時間の経過とともに初期化されていない場合、およびトレーニングセッションのランダムな一連のフレームでトレーニングされている場合、実際のデータではあまり予測できない傾向があります。したがって、ゼロ状態の各フレームを開始することが重要であることを確認してください。 TF発行委員会では、新しい 'dynamic_rnn'実装が各フレームで自動的に状態をゼロに初期化するとのコメントを見ました。しかし、私の場合、私は異常を見て、グラフの一部として初期化を保証したかったのです。 – Hephaestus

関連する問題