Tensorflow的计算时间逐渐减慢,非常简单" for循环"

时间:2017-06-21 07:46:35

标签: python tensorflow

我在tensorflow上有一个非常奇怪的问题。我将我的问题简化为以下版本:

我只是在张量流语言中编写一个简单的矩阵乘法,然后我把这个矩阵乘法放在" for循环中#34;(当然你可以把其他复杂的函数放在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.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
几秒钟后,我得到了这个:

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

这意味着计算速度正在减慢。谁能告诉我为什么?非常感谢。

2 个答案:

答案 0 :(得分:4)

每次循环时都会创建一个新操作。 (tf.matmul)

因此,您的张量流图越来越无法控制。

在tensorflow中,您创建一次操作(例如:tf.matmul(A,B)),然后使用sess.run多次执行此操作(例如:sess.run(RESULT,fe​​ed_dict = {A:ai) ,B:bi}。

创建一个操作就像编写一个函数或创建一个处理单元一样,你只需要创建一次,然后就可以将它用于许多输入。

答案 1 :(得分:3)

Arnaud是对的。为了补充他的答案,你应该做的是:

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