以下代码使用tensorflow库,与numpy库相比,它的运行速度非常慢。我知道我正在调用一个函数,它在python for循环中使用tensorflow库(后面我将与python多处理并行化),但代码原样,运行速度极慢。
有人可以帮助我如何让这段代码更快地运行吗?感谢。
from math import *
import numpy as np
import sys
from multiprocessing import Pool
import tensorflow as tf
def Trajectory_Fun(tspan, a, b, session=None, server=None):
# Open tensorflow session
if session==None:
if server==None:
sess = tf.Session()
else:
sess = tf.Session(server.target)
else:
sess = session
B = np.zeros(np.size(tspan), dtype=np.float64)
B[0] = b
for i, t in enumerate(tspan):
r = np.random.rand(1)
if r>a:
c = sess.run(tf.trace(tf.random_normal((4, 4), r, 1.0)))
else:
c = 0.0 # sess.run(tf.trace(tf.random_normal((4, 4), 0.0, 1.0)))
B[i] = c
# Close tensorflow session
if session==None:
sess.close()
return B
def main(argv):
# Parameters
tspan = np.arange(0.0, 1000.0)
a = 0.1
b = 0.0
# Run test program
B = Trajectory_Fun(tspan, a, b, None, None)
print 'Done!'
if __name__ == "__main__":
main(sys.argv[1:])
答案 0 :(得分:4)
如您的问题中所述,此程序将提供较差的性能,因为它为每个操作创建了几个新的TensorFlow图形节点。 TensorFlow中的基本假设是(大约)您将构建一次图形,然后多次调用sess.run()
(的各个部分)。第一次运行图表相对昂贵,因为TensorFlow必须构建各种数据结构并优化跨多个设备的图形执行。
但是,TensorFlow缓存了这项工作,因此后续使用要便宜得多。
通过构造一次图表并使用(例如)tf.placeholder()
操作来输入每次迭代中更改的值,您可以更快地完成此程序。例如,以下应该可以解决问题:
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的好处。