2016-03-10 12 views
5

TensorFlowは、同じ計算(サブ)グラフへの複数の呼び出しを含む の計算を自動的にキャッシュできますか?Tensorは、キャッシュ(サブ)グラフの計算をフローできますか?

例えば、私は行列Fを持っており、各エントリは、訓練可能な変数Wに基づく の計算を表しています。私の目的関数 は、この行列にさまざまなベクトルを数回乗算します(それぞれ 時間は変更されずにWです)。

にアクセスするたびに、TensorFlowはたとえばF[1,2]を再計算しますか、それともその値をキャッシュしますか?

は理論的には、一方が行列固定Wは、F内の各エントリはtf.constant であるように、所与のFを事前計算できました。しかし、 は、Wの勾配の正しい​​計算を妨げます。

+0

この質問は関連しているようです:http://stackoverflow.com/questions/34536340/how-to-use-tensorflow-optimizer-without-recomputing-activations-in-reinforcement –

答えて

2

TensorFlowは限られた量のキャッシングを実行しますが、説明したケースをカバーしていない可能性があります。

次のオプションでtf.Sessionを作成した場合、一定の折りたたみが可能になります。

config = tf.ConfigProto(graph_options=tf.GraphOptions(
    optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L2))) 
sess = tf.Session(config=config) 

この設定でsess.run()を呼び出すと、TensorFlowはこれらの部分グラフを確認、その後、実行するための適切なノードを評価します出力が一定であるノードを評価し、結果をキャッシュする。したがって、冗長な計算を再実行することはありません。

しかし、あなたの質問では、Fはいくつかの訓練可能な変数の関数であると言います。 TensorFlowの観点から見ると、これらの変数は揮発性であり、いつでも—に変更される可能性があるため、これらの変数から派生した値はキャッシュされません。同じ値をFに複数回再利用したい場合は、tf.constant()に格納することを検討して、定数の折りたたみの最適化がより有効になるようにすることができます。

+0

情報ありがとうございます。 'tf.OptimizerOptions.L1'オプションは' common_subexpression_elimination'を行い、 'tf.OptimizerOptions.L2'は' constant_folding'を行います。しかし、これらのオプションがグラデーションを正しく処理できない場合、私の場合はうまくいかないでしょう。 –

+0

どちらの最適化もプログラムのセマンティクスに影響しないはずなので、グラデーションを正しく処理する必要があります。しかし、グラディエント計算の大部分は現在の変数値に依存しているため、大きなスピードアップは期待できません(多分、オペレーションのディスパッチオーバーヘッドを排除するために数パーセント)。 – mrry

関連する問題