【问题标题】:What is the most efficient way to interchange the values of two variables in a Tensorflow graph?在 Tensorflow 图中交换两个变量的值的最有效方法是什么?
【发布时间】:2018-09-21 11:45:09
【问题描述】:

给定一个包含两个变量 var1 和 var2 的 Tensorflow 图,我想将 var1 的值分配给 var2,反之亦然。一种简单的方法是(帖子末尾的 MWE)

var_tmp = var1.eval(session=sess)
sess.run([tf.assign(var1, var2])
sess.run([tf.assign(var2, var_tmp)])

但是,如果有几对这样的变量(例如模型参数和相关的指数加权移动平均线),这个方法很快就会变得相当慢,因为 run 每次调用 3 次,它实际上会造成内存泄漏(@ 987654321@)。另外,由于 var_tmp 放在 CPU 上,如果 var1 和 var2 在 GPU 上,由于数据传输,执行速度会更慢。

对于多对变量的情况,我想避免创建图形的整个副本来保存临时变量。

是否可以为一对变量定义一个操作来执行此操作?或者更好,多对?

MWE:

import tensorflow as tf

var1 = tf.Variable(1)  # 'Variable:0' 
var2 = tf.Variable(2)  # 'Variable_1:0'
sess = tf.Session()
sess.run(tf.global_variables_initializer())

var_tmp = var1.eval(session=sess)
sess.run([tf.assign(var1, var2)])
sess.run([tf.assign(var2, var_tmp)])

print(var1.eval(session=sess))
print(var2.eval(session=sess))

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    最好的方法是使用资源变量(tf.enable_resource_variables() 在 1.11 之后,tf.get_variable_scope().set_use_resource(True) 在此之前)和类似的图表

     a_value = a.read_value()
     b_value = b.read_value()
     with tf.control_dependencies([a_value, b_value]):
       ops = a.assign(b_value), b.assign(a_value)
    
     sess.run(ops)
    

    【讨论】:

    • 很好的解决方案,非常感谢。给定一个模型和训练管道,据我所知,这会将所有变量更改为资源变量。您是否知道这可能带来的任何“重大”变化?
    • 不应该有任何回归。
    • 它似乎以某种方式影响了 Keras 层。当由optimizer.compute_gradients 计算时,2D 卷积之后的批量归一化层返回None 梯度,但我无法查明原因。如果其他人遇到类似问题,我将在此处留下此评论。
    • 是您试图通过作业反向传播的问题吗?这不是 tf 让你做的事情。
    • 这不应该是原因,因为我不想这样做。但我想这可能是意外错误的原因。我的ab 变量分别是网络中的可训练变量和该变量的(不可训练的)指数移动平均值。我在验证和训练时切换这些,但分配操作不应该是训练图的一部分。
    【解决方案2】:

    不深入TensorFlow的细节,我建议你使用这个-

    var1, var2 = var2, var1

    如果您想交换多对,请尝试 -

    for var1, var2 in pairs:
        var1, var2 = var2, var1
    

    希望这会有所帮助。

    【讨论】:

    • 是的,这会改变 python 变量 var1 和 var2 的引用,但不会将 Tensorflow 变量“Variable:0”的值更改为“Variable_1:0”的值,这就是我的意思寻求
    • 好吧,我的错。我会寻找答案的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2010-09-07
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多