2017-01-05 4 views
1

2段階のモデルを作成しようとしています。 最初のイメージは入力イメージを取得し、それをconv-deconvネットワークに渡します。結果として生じるTensorは、所望の出力画像(入力画像と同じサイズ)の画素に対応するエントリを有する。Tensorflowを使用しているときに大きな行列計算をメモリにフィッティングする

最終出力画像を計算するには、各ピクセル位置で生成された値を最初のフェーズから取り出し、それを入力画像全体に適用される縮小関数の追加入力として使用します。この第2ステップには学習可能な変数はありませんが、入力のサイズに応じて指数関数的に増加する計算/メモリコストがあります(各出力ピクセルはすべての入力ピクセルの関数です)。

私は現在、tf.map_fnを使用して出力イメージを計算しています。私は出力ピクセル計算関数を第1段階の結果にマッピングしています。私の望みは、テンソルフローが、各ピクセル計算に必要な中間テンソルを格納し、次にそのメモリを解放して次のピクセル計算に移るためにメモリを割り当てるということです。しかし、代わりにOOMエラーを引き起こす中間計算を解放することは決してないようです。

テンソルのデータを保持するために割り当てられたメモリを解放する必要があることをテンソルフロー(明示的にも暗黙的にも)で指摘できますか?

+0

を、あなたは、複数のテンソルにあなたの計算を分割していますか? (つまり、TensorFlowはテンソルオブジェクトの一部を解放しません) –

+0

はい。私はもともと巨大な行列操作をしようとしましたが、それがなぜ機能していないのかが私には分かります。これは、個々のピクセル計算ごとにテンソルを作成するためにtf.map_fn()に私を導いてくれました。 – ArEsKay3

答えて

0

TensorFlowは、将来の計算にテンソルが必要なくなるとすぐにテンソルのメモリを割り当て解除します。これを確認するには、notebookに示すようなメモリ割り当て解除メッセージを確認します。

TensorFlowがメモリ内のノードを非効率的に実行するため、メモリが不足している可能性があります。

例として、計算を以下の検討:

k = 2000 
a = tf.random_uniform(shape=(k,k)) 
for i in range(n): 
    a = tf.matmul(a, tf.random_uniform(shape=(k,k))) 

それが評価される順序は、すべてのサークル(tf.random_uniform)ノードが最初に評価され

、以下に示すことができ、続いて正方形(tf.matmul)。これは、O(n)のメモリ要件と比較して、最適な順序はO(1)です。

あなたは以下のようにヘルパー関数を使用して、すなわち、特定の実行順序を強制的にコントロールの依存関係を使用することができます。

import tensorflow.contrib.graph_editor as ge 
def run_after(a_tensor, b_tensor): 
    """Force a to run after b""" 
    ge.reroute.add_control_inputs(a_tensor.op, [b_tensor.op]) 
+0

おかげさまで、私が依存関係を正しく得ることができれば、これは自動的に処理されるべきであると聞いてうれしいです。私の場合、map_fnを使用しているので、操作を順番に実行するように強制する方法はすぐにわかりません(parallel_iterations = 1を設定すると、私の考えたように私の問題を解決できなかったようです。マッピング関数によって生成された出力テンソルの集合を構築し、あなたが示唆したようにそれらを依存関係と一緒にストリングするのは適切なアプローチのようですか? – ArEsKay3

+0

Hm、map_fnはテンソルのスライス上で動作しますが、不要なスライスのメモリを解放することはできません。通常のPythonマップを使用しないでください。 –

+0

それは理にかなっています。私はテンソルフローオプスを使う傾向がありましたが、それは過度のものかもしれないと思います。私はtf.map_fnへの入力/出力の大きさについては心配していませんが、マッピング関数内で生成されたちょうど中間のテンソル(それが意味をなさない場合)です。私はまだ依存関係のチェーンを構築する必要があるだろうpythonのマップの場合は? – ArEsKay3

関連する問題