2017-06-21 14 views
1

テンソルフローで非常に奇妙な問題があります。非常に単純な "forループ"でTensorflowの計算時間が徐々に減速します

単純な行列乗算をテンソルフロー言語で書くだけで、この行列乗算を「forループ」に入れます(もちろん、他の複雑な関数をforループに入れることもできますが、結論は同じです)。

繰り返し回数を10000回に設定し、各ループで時間を消費すると、時間の消費が徐々に増加していることがわかります(各ループの時間は同じでなければなりませんが、初めに)

import tensorflow as tf 
import numpy as np 
import datetime 

graph=tf.Graph() 
with graph.as_default(): 
    with tf.device("/gpu:0"): 
     a=np.arange(10).reshape(1,-1) 
     b=np.arange(100).reshape(10,10) 
     A = tf.placeholder(tf.float32, [1,10]) 
     B = tf.placeholder(tf.float32, [10,10]) 


     sess = tf.InteractiveSession() 

     for step in range(10000): 
      starttime = datetime.datetime.now() 

      RESULT = tf.matmul(A,B) 
      RESULT=sess.run(RESULT,feed_dict={A: a, B: b}) 

      endtime = datetime.datetime.now() 
      print(endtime-starttime) 

、プログラムは次のような結果印刷:

0:00:00.011470 
0:00:00.013232 
0:00:00.013088 
0:00:00.015906 
0:00:00.012659 
0:00:00.012914 
0:00:00.012562 
0:00:00.011941 
0:00:00.013575 
0:00:00.012251 
0:00:00.013759 
0:00:00.012534 
0:00:00.011859 

... 

0:00:00.031062 
0:00:00.031676 
0:00:00.031388 
0:00:00.031349 
0:00:00.032476 
0:00:00.031337 
0:00:00.031147 
0:00:00.031121 
0:00:00.030795 
0:00:00.031143 
0:00:00.031277 
0:00:00.031015 
0:00:00.034139 
0:00:00.032749 
:数秒後に

0:00:00.003058 
0:00:00.003216 
0:00:00.003195 
0:00:00.003213 
0:00:00.003653 
0:00:00.003599 
0:00:00.003297 
0:00:00.003172 
0:00:00.003235 
0:00:00.004374 
0:00:00.003442 
0:00:00.003387 
0:00:00.003290 

を、私はこれを得ました

これは、計算が遅くなることを意味します。なぜ誰かが私に言うことができますか?どうもありがとう。

答えて

3

ループを通過するたびに新しい操作を作成しています。 (tf.matmul)

このように、テンソルフローグラフは制御不能になりつつあります。

テンソルフローでは、操作を一度作成してから(例:tf.matmul(A、B))、この操作をsess.run(ex:sess.run(RESULT、feed_dict = {A: AI、B:双方向}

操作を作成する機能を書いたり、処理ユニットを作成するようなものです、あなたは一度だけ、それを作成する必要があり、その後、あなたは多くの入力でそれを使用することができます

+0

ありがとうございます!!!!!!!!!!!さらに、あなたは非常に迅速に答えた!!!!!!!!!!!!!、あなたは正しい!!!!!!!!! – zeekzhen

2

アルノーが正しいです。彼の答えに追加するには、あなたがするべきことは次のとおりです:

import tensorflow as tf 
import numpy as np 
import datetime 

graph=tf.Graph() 
with graph.as_default(): 
    with tf.device("/gpu:0"): 
     a = np.arange(10).reshape(1,-1) 
     b = np.arange(100).reshape(10,10) 
     A = tf.placeholder(tf.float32, [1,10]) 
     B = tf.placeholder(tf.float32, [10,10]) 
     C = tf.matmul(A,B) #changed 

     sess = tf.InteractiveSession() 

     for step in range(10000): 
      starttime = datetime.datetime.now() 

      RESULT = sess.run(C,feed_dict={A: a, B: b}) #changed 

      endtime = datetime.datetime.now() 
      print(endtime-starttime) 

この方法では、操作tf.matmulを1回だけ作成しています。

+0

ありがとう、あなたも正しいです。あなたの両方のために多くのおかげです。 – zeekzhen

関連する問題