避免使用assign操作使张量流图混乱

时间:2016-02-23 11:29:21

标签: python tensorflow

我必须运行类似以下代码的内容

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=来设置值,但我想将状态保留在图表中,以便我可以在其他地方轻松查询。

在这种情况下,是否有某种方法可以避免使当前图形混乱?

2 个答案:

答案 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)