我必须运行类似以下代码的内容
import tensorflow as tf
sess = tf.Session()
x = tf.Variable(42.)
for i in range(10000):
sess.run(x.assign(42.))
sess.run(x)
print(i)
几次。实际代码更复杂,使用更多变量。
问题是TensorFlow图随着每个实例化的赋值运算而增长,这会使图增长,最终减慢计算速度。
我可以使用feed_dict=
来设置值,但我想将状态保留在图表中,以便我可以在其他地方轻松查询。
在这种情况下,是否有某种方法可以避免使当前图形混乱?
答案 0 :(得分:3)
我认为我找到了一个很好的解决方案:
我定义了占位符y
并创建了一个将y
的值分配给x
的操作。
然后我可以反复使用该操作,使用feed_dict={y: value}
为x分配新值。
这不会向图表添加另一个操作。
事实证明,循环运行很多比以前更快。
import tensorflow as tf
sess = tf.Session()
x = tf.Variable(42.)
y = tf.placeholder(dtype=tf.float32)
assign = x.assign(y)
sess.run(tf.initialize_all_variables())
for i in range(10000):
sess.run(assign, feed_dict={y: i})
print(i, sess.run(x))
答案 1 :(得分:1)
每次致电sess.run(x.assign(42.))
发生了两件事:(i)将新的assign
操作添加到计算图sess.graph
,(ii)执行新添加的操作。难怪如果循环重复多次,图形会变得非常大。如果在执行之前定义赋值操作(在下面的示例中为asgnmnt_operation
),则只需向图中添加一个操作,因此性能非常好:
import tensorflow as tf
x = tf.Variable(42.)
c = tf.constant(42.)
asgnmnt_operation = x.assign(c)
sess = tf.Session()
for i in range(10000):
sess.run(asgnmnt_operation)
sess.run(x)
print(i)