tensorflow在python for循环中运行非常慢
下面的代码使用tensorflow库,与numpy库相比,它的运行速度非常慢。我知道我正在调用一个函数,该函数在python for loop中使用tensorflow库(稍后我将与python多处理并行),但代码运行速度非常慢 有人能帮助我如何使代码运行得更快吗?谢谢tensorflow在python for循环中运行非常慢,tensorflow,Tensorflow,下面的代码使用tensorflow库,与numpy库相比,它的运行速度非常慢。我知道我正在调用一个函数,该函数在python for loop中使用tensorflow库(稍后我将与python多处理并行),但代码运行速度非常慢 有人能帮助我如何使代码运行得更快吗?谢谢 正如您在问题中所述,此程序的性能较差,因为它会在每个操作中创建几个新的TensorFlow图节点。TensorFlow中的基本假设是(大约)构建一个图,然后多次调用它的sess.run()。第一次运行图形的成本相对较高,因为T
正如您在问题中所述,此程序的性能较差,因为它会在每个操作中创建几个新的TensorFlow图节点。TensorFlow中的基本假设是(大约)构建一个图,然后多次调用它的
sess.run()
。第一次运行图形的成本相对较高,因为TensorFlow必须构建各种数据结构,并在多个设备上优化图形的执行。
然而,TensorFlow缓存了这项工作,因此后续的使用要便宜得多
通过构造一次图并使用(例如)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的好处。如您在问题中所述,此程序将提供较差的性能,因为它会在每个操作中创建几个新的TensorFlow图节点。TensorFlow中的基本假设是(大约)构建一个图,然后多次调用它的sess.run()
。第一次运行图形的成本相对较高,因为TensorFlow必须构建各种数据结构,并在多个设备上优化图形的执行。
然而,TensorFlow缓存了这项工作,因此后续的使用要便宜得多
通过构造一次图并使用(例如)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的好处。您正在修改session.run调用之间的图形对象,这很慢。您可以在第一次sess之前添加所有操作。运行并调用tf.get\u default\u graph().finalize()
@YaroslavBulatov感谢您的快速响应。正如您可能已经注意到的,我需要每个时间步的变量c的值。你能再澄清一下我如何将你的建议纳入我的上述代码中吗?我将不胜感激。谢谢。在循环开始之前执行类似于a=tf.random\u normal((4,4),0.0,1.0)
的操作,然后执行sess.run(a)
而不是在session.run调用之间修改图形对象,这很慢。您可以在第一次sess之前添加所有操作。运行并调用tf.get\u default\u graph().finalize()
@YaroslavBulatov感谢您的快速响应。正如您可能已经注意到的,我需要每个时间步的变量c的值。你能再澄清一下我如何将你的建议纳入我的上述代码中吗?我将不胜感激。谢谢。在循环开始之前,执行类似于a=tf.random\u normal((4,4),0.0,1.0)
的操作,然后执行sess。改为运行(a)