我试图通过编码一些简单的问题来学习张量流:我试图使用直接采样蒙特卡罗方法找到 pi 的值。
运行时间比我想象的要长得多for loop
去做这个。我看过其他关于类似事情的帖子,并且我尝试遵循解决方案,但我认为我仍然一定做错了什么。
下面附上我的代码:
import tensorflow as tf
import numpy as np
import time
n_trials = 50000
tf.reset_default_graph()
x = tf.random_uniform(shape=(), name='x')
y = tf.random_uniform(shape=(), name='y')
r = tf.sqrt(x**2 + y**2)
hit = tf.Variable(0, name='hit')
# perform the monte carlo step
is_inside = tf.cast(tf.less(r, 1), tf.int32)
hit_op = hit.assign_add(is_inside)
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# Make sure no new nodes are added to the graph
sess.graph.finalize()
start = time.time()
# Run monte carlo trials -- This is very slow
for _ in range(n_trials):
sess.run(hit_op)
hits = hit.eval()
print("Pi is {}".format(4*hits/n_trials))
print("Tensorflow operation took {:.2f} s".format((time.time()-start)))
>>> Pi is 3.15208
>>> Tensorflow operation took 8.98 s
相比之下,做一个for loop
numpy 中的类型解决方案速度快一个数量级
start = time.time()
hits = [ 1 if np.sqrt(np.sum(np.square(np.random.uniform(size=2)))) < 1 else 0 for _ in range(n_trials) ]
a = 0
for hit in hits:
a+=hit
print("numpy operation took {:.2f} s".format((time.time()-start)))
print("Pi is {}".format(4*a/n_trials))
>>> Pi is 3.14032
>>> numpy operation took 0.75 s
下面附上的图表显示了不同次数的试验的总体执行时间的差异。
请注意:我的问题不是关于“如何最快地执行此任务”,我认识到有更多有效的方法来计算 Pi。我仅使用它作为基准测试工具来根据我熟悉的东西(numpy)检查张量流的性能。