【问题标题】:Avoid cluttering the tensorflow graph with assign operations避免使用分配操作使张量流图混乱
【发布时间】:2016-02-23 11:29:20
【问题描述】:

我必须运行类似下面的代码

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

在这种情况下,有什么方法可以避免当前图表混乱吗?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我想我已经找到了一个很好的解决方案: 我定义了一个占位符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))
    

    【讨论】:

    • 是的,这绝对是一种更好的做事方式。我们在示例代码中尝试做的一件事是在创建 tf.Session 之前定义整个图形 - 或尽可能接近 - 这样就不会出现此类问题。
    【解决方案2】:

    每次拨打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)
    

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2018-12-07
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多