2017-06-25 7 views
2

Python/Numpyを使用して、CPUからTensorFlowを使用して単純な畳み込みニューラルネットワークを実行し、ディスクからデータをロードして準備します。 Python/Numpyの部分はわずか32個の1MBイメージを読み込んでいるので、予想どおりメモリをほとんど消費しません。メモリ効率的なTensorFlow用の設計トリックN

ただし、実行中のsess.run(AdamOptimizer)メモリ使用量は天文学的にピークに達します。memory_profilerの出力では、4トレーニングサイクルと1テストサイクルを示しています。 TensorFlow memory usage, 4 training cycles one test cycle, from https://pypi.python.org/pypi/memory_profiler

12GBのピークは、バッチのサイズ、トレーニングネットワークの数、または自分のレイヤーのサイズを制限します。このピークは、sess.run(accuracy)ステートメントに等価に存在するため、このピークはPythonからTFへのデータ転送またはフォワードアクティベーションでのデータ転送と関係があります。

おそらくCNNグラフをうまく設計できませんでしたか?誰かが、私は特にメモリのために留意すべきデザインルールを指摘できますか?これを時間どおりに塗りつぶすことは可能ですか? - 12GBのピークに2倍の時間がかかり、半分の時間がかかる場合は改善されます。最後に、ピークの開始時間と終了時間を通知する方法があるため、複数のネットワークを管理してインターレースを訓練することができますか? (約2秒の狭いピークは、sess.run()の文で約20秒かかることに注意してください)

答えて

1

他に誰かが何か追加している場合、私は喜んで答えを送っています。ちょうど私が見つけたものを共有したいと思った。

tf.nn.conv2dは特にメモリが空いているように見えますが、多分それは何らかの形で全体的に意味がありますが、私にとっては予想以上のものです。メモリプロファイラで見られるよう

x = tf.placeholder(tf.float32, shape=[None, 256, 256, 4]) 
w = tf.Variable(tf.truncated_normal([f, f, 4, 8], stddev=0.1)) 
outp = tf.nn.conv2d(x, w, strides=[1,1,1,1], padding='SAME') 

outp_v = sess.run(outp, 
     feed_dict={x:np.ones(32*256*256*4).reshape(32,256,256,4)}) 

:次の簡単なプログラムは、私が数百メガバイト以上のものを期待していない5.5ギガバイト使用しています。この出力のために https://pypi.python.org/pypi/memory_profiler/0.47 output. を私はかなり大きな数f = 16を使用しますが、私が見つかりました。メモリ使用量はそれとは独立しています。十分に小さいものを除いて、fは計算が非常に速いため、メモリプロファイルユーティリティの時間分解能よりも低くなり、任意の高さに鋭いピーク(プラトーなし)のみが残る。

他類似したメモリの使用状況を確認してください: tensorflow conv2d memory consumption explain?

関連する問題