Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tensorflow图中交换两个变量值的最有效方法是什么?_Tensorflow - Fatal编程技术网

在Tensorflow图中交换两个变量值的最有效方法是什么?

在Tensorflow图中交换两个变量值的最有效方法是什么?,tensorflow,Tensorflow,给定一个包含两个变量var1和var2的Tensorflow图,我想将var1的值赋给var2,反之亦然。一个简单的方法是(在文章末尾的MWE) 但是,如果有几对这样的变量(例如模型参数和相关的指数加权移动平均数),这种方法很快就会变得相当慢,因为对每个变量调用了三次run,实际上会造成内存泄漏()。此外,由于var_tmp位于CPU上,如果var1和var2位于GPU上,由于数据传输,执行速度会更慢 对于多对变量的情况,我希望避免创建图形的整个副本来保存临时变量 可以为一对变量定义一个单独的操

给定一个包含两个变量var1和var2的Tensorflow图,我想将var1的值赋给var2,反之亦然。一个简单的方法是(在文章末尾的MWE)

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

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

可以为一对变量定义一个单独的操作吗?或者更好,几双

MWE:


在不深入讨论TensorFlow的细节的情况下,我建议您使用这个-

var1,var2=var2,var1

如果要交换多对,请尝试-

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

希望这有帮助。

最好的方法是使用资源变量(使用
tf.enable\u resource\u variables()
在1.11之后,
tf.get\u variable\u scope().set\u use\u 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)

是的,这会更改python变量var1和var2的引用,但不会将Tensorflow变量“variable:0”的值更改为“variable_1:0”“这就是我要找的好吧,我的错。我将寻找答案。很好的解决方案,非常感谢。给定一个模型和训练管道,这将把我所能看到的所有变量都变成资源变量。你知道这可能带来什么“突破性”变化吗?不应该有任何倒退。它似乎以某种方式影响Keras层。当由优化器计算时,2D卷积后的批归一化层返回
None
梯度。计算梯度,但我还不能确定原因。如果其他人遇到类似的问题,我会在这里留下这个评论。你是不是想通过作业来支持这个问题?这不是tf让你做的事。这不应该是原因,因为我不想这么做。但我想这可能是一个偶然的错误。My
a
b
变量分别是网络中的可训练变量和该变量的(不可训练)指数移动平均值。我将在验证和培训时切换这些操作,但是分配操作不应该是培训图的一部分。
for var1, var2 in pairs:
    var1, var2 = var2, var1
 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)