Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tensorflow在python for循环中运行非常慢_Tensorflow - Fatal编程技术网

tensorflow在python for循环中运行非常慢

tensorflow在python for循环中运行非常慢,tensorflow,Tensorflow,下面的代码使用tensorflow库,与numpy库相比,它的运行速度非常慢。我知道我正在调用一个函数,该函数在python for loop中使用tensorflow库(稍后我将与python多处理并行),但代码运行速度非常慢 有人能帮助我如何使代码运行得更快吗?谢谢 正如您在问题中所述,此程序的性能较差,因为它会在每个操作中创建几个新的TensorFlow图节点。TensorFlow中的基本假设是(大约)构建一个图,然后多次调用它的sess.run()。第一次运行图形的成本相对较高,因为T

下面的代码使用tensorflow库,与numpy库相比,它的运行速度非常慢。我知道我正在调用一个函数,该函数在python for loop中使用tensorflow库(稍后我将与python多处理并行),但代码运行速度非常慢

有人能帮助我如何使代码运行得更快吗?谢谢



正如您在问题中所述,此程序的性能较差,因为它会在每个操作中创建几个新的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)