我在 tensorflow 上有一个很奇怪的问题。我将我的问题简化为以下版本:
我只是用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.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
这意味着计算正在变慢。谁能告诉我为什么?非常感谢。
请您参考如下方法:
每次执行循环时,您都在创建一个新操作。 (tf.matmul)
因此,您的 tensorflow 图正在失控。
在 tensorflow 中,您创建一次操作(例如:tf.matmul(A,B)),然后使用 sess.run 多次执行此操作(例如:sess.run(RESULT, feed_dict={A: ai , B: bi}.
创建一个操作就像编写一个函数或创建一个处理单元,您只需创建一次,然后就可以将它用于许多输入。
