2016-10-25 8 views
0

次のコードはtensorflowライブラリを使用し、numpyライブラリに比べて非常に遅く実行されます。私は、Python forループ内でテンソルフローライブラリを使用する関数を呼び出していることを認識しています(後でPythonマルチプロセッシングと並列化します)が、コードは非常に遅いです。テンソルフローはPythonのループ内で非常に遅く実行されます

誰かがこのコードをより速く実行させる方法を手伝ってもらえますか?ありがとう。


from math import * 
import numpy as np 
import sys 
from multiprocessing import Pool 
import tensorflow as tf 

def Trajectory_Fun(tspan, a, b, session=None, server=None): 
    # Open tensorflow session 
    if session==None: 
     if server==None: 
      sess = tf.Session() 
     else: 
      sess = tf.Session(server.target)  
    else: 
     sess = session 
    B = np.zeros(np.size(tspan), dtype=np.float64) 
    B[0] = b 
    for i, t in enumerate(tspan): 
     r = np.random.rand(1) 
     if r>a: 
      c = sess.run(tf.trace(tf.random_normal((4, 4), r, 1.0))) 
     else: 
      c = 0.0 # sess.run(tf.trace(tf.random_normal((4, 4), 0.0, 1.0))) 
     B[i] = c 
    # Close tensorflow session 
    if session==None: 
     sess.close() 
    return B 

def main(argv): 
    # Parameters 
    tspan = np.arange(0.0, 1000.0) 
    a = 0.1 
    b = 0.0 
    # Run test program 
    B = Trajectory_Fun(tspan, a, b, None, None) 
    print 'Done!' 

if __name__ == "__main__": 
    main(sys.argv[1:]) 
+0

遅いsession.run呼び出しの間にGraphオブジェクトを変更しています。最初の 'sess.run'の前にすべての操作を追加し、' tf.get_default_graph()。finalize() 'を呼び出すことができます –

+0

@YaroslavBulatovあなたの素早い応答に感謝します。気づいたことがあるかもしれませんが、私は各時間ステップで変数cの値が必要です。上記のコードにあなたの提案を組み込む方法をもう少し明確にしてください。私はそれをお願い申し上げます。ありがとう。 – QED

+0

ループ開始前に 'a = tf.random_normal((4,4)、0.0,1.0)'のようにしてから、 'sess.run(a)'を実行してください –

答えて

2

あなたの質問で述べたように、それは操作ごとにいくつかの新しいTensorFlowグラフノードを作成するため、このプログラムは、パフォーマンスの低下が得られます。 TensorFlowの根底にある仮定は、グラフを一度作成してから、その部分(複数の部分)に複数回sess.run()を呼び出すということです。 TensorFlowはさまざまなデータ構造を構築し、複数のデバイス間でグラフの実行を最適化する必要があるため、グラフを初めて実行するときは比較的高額です。 しかし、TensorFlowはこの作業をキャッシュします。そのため、その後の使用はずっと安価です。

グラフを一度作成して、(たとえば)tf.placeholder() opを使用して、各繰り返しで変化する値を入力することで、このプログラムをより高速にすることができます。たとえば、次の例は、トリックを行う必要があります。

B = np.zeros(np.size(tspan), dtype=np.float64) 
B[0] = b 

# Define the TensorFlow graph once and reuse it in each iteration of the for loop. 
r_placeholder = tf.placeholder(tf.float32, shape=[]) 
out_t = tf.trace(tf.random_normal((4, 4), r_placeholder, 1.0)) 

with tf.Session() as sess: 
    for i, t in enumerate(tspan): 
    r = np.random.rand(1) 
    if r > a: 
     c = sess.run(out_t, feed_dict={r_placeholder: r}) 
    else: 
     c = 0.0 
    B[i] = c 
    return B 
あなたが潜在的に、これは、より効率的なTensorFlowループを使用して sess.run()に少ない呼び出しを行うが、一般的な原理は同じであることによって作ることができ

:同じグラフの複数の再利用TensorFlowの利点を得るために、

関連する問題