在tensorflow中,如果我们想运行多个操作,那么如果我们将列表中的操作传递给单个sess.run(),与使用多个sess.run()而只将一个操作传递给每个操作,会有什么不同(例如速度或结果)?
示例:
#!/usr/env/bin python
import tensorflow as tf
if __name__ == '__main__':
v = tf.Variable(0)
c = tf.constant(3)
add = tf.add(v, c)
update = tf.assign(v, add)
mul = tf.multiply(add, update)
init = tf.compat.v1.global_variables_initializer()
# method 1
with tf.Session() as sess:
sess.run(init)
print(sess.run(add))
print(sess.run(mul))
# method 2
with tf.Session() as sess:
print(sess.run([init, add, mul]))编辑:最初,我还在想,是否存在多个会话会导致不同结果的情况,例如计算图中的依赖导致执行顺序不同等等。但我在问题中没有明确说明这一点,而是给出了一个相当虚假的例子。
发布于 2019-08-15 22:06:36
每次运行init时,所有的权重都是随机初始化的,因此不能以这种方式进行比较。如果您真的想进行比较,我将运行以下代码:
#!/usr/env/bin python
import tensorflow as tf
if __name__ == '__main__':
v = tf.Variable(0)
c = tf.constant(3)
add = tf.add(v, c)
update = tf.assign(v, add)
mul = tf.multiply(add, update)
init = tf.compat.v1.global_variables_initializer()
# method 1
with tf.Session() as sess:
sess.run(init)
print(sess.run(add))
print(sess.run(mul))
print(sess.run([add, mul]))发布于 2019-08-15 22:13:27
在结果方面没有任何差别:
import numpy as np
tf.reset_default_graph()
v = tf.Variable(0)
c = tf.constant(3)
add = tf.add(v, c)
update = tf.assign(v, add)
mul = tf.multiply(add, update)
init = tf.compat.v1.global_variables_initializer()
def single():
with tf.Session() as sess:
sess.run(init)
fetch_add = sess.run(add)
fetch_mul = sess.run(mul)
return fetch_add, fetch_mul
def multiple():
with tf.Session() as sess:
sess.run(init)
fetch_add, fetch_mul = sess.run([add, mul])
return fetch_add, fetch_mul
add_single, multiply_single = single()
add_multiple, multiply_multiple = multiple()
np.testing.assert_array_equal(add_single, add_multiple)
np.testing.assert_array_equal(multiply_single, multiply_multiple)当谈到速度时,以下是一些衡量标准:
%timeit single()
# 7.44 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit multiple()
# 5.56 ms ± 121 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)因此,如果您一起运行多个节点,那么运行速度肯定会更快。
https://stackoverflow.com/questions/57516740
复制相似问题