如何控制 Tensorflow 中的分配顺序?
How to control assignments order in Tensorflow?
我已经在 Tensowrflow 图中实现了一些张量初始化作为赋值网。同时,这些赋值应该以正确的顺序调用,因为一个使用另一个的结果。如果我将分配节点暴露给外部,用户(我自己也是)应该 运行 通过会话调用
sess.run([assign1, assign2, ...])
顺序正确,可能会出错。我可以将分配序列加入单个操作并仅公开它吗运行?
更新
我写了这段代码,发现它打印了眼睛?为什么?它应该打印 b
的随机初始化,不是吗?
import tensorflow as tf
tf.reset_default_graph()
a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2))
c = tf.get_variable("c", shape=(2,2))
assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run([assign_c, assign_b])
print(c.eval())
更新 2
下面的代码显示我无法使用 group
控制 assignmen 顺序:
import tensorflow as tf
tf.reset_default_graph()
a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2), initializer=tf.zeros_initializer)
c = tf.get_variable("c", shape=(2,2))
assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)
incorrect_init = tf.group(assign_b, assign_c)
correct_init = tf.group(assign_c, assign_b)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run([incorrect_init])
#sess.run([correct_init])
print(c.eval())
结果总是
[[ 1. 0.]
[ 0. 1.]]
不管我叫correct_init
还是incorrect_init
。为什么?如何强制排序?
您可以使用 tf.group 对运算符进行分组。如果有任何依赖关系,Tensorflow 将为您解决所有依赖关系。
更新
c <- assign_c =>
c <- b =>
c <- assign_b =>
c <- a
即使您省略了 sess.run([assign_c, assign_b])
步骤。
更新 2
如果您需要保持 3 个独立的张量或运算符的执行顺序,您可以使用 control_dependencies,但前提是没有任何依赖关系。
with tf.control_dependencies([first]):
op1 = tf.no_op()
with tf.control_dependencies([op1, second]):
op2 = tf.no_op()
with tf.control_dependencies([op2, third]):
op3 = tf.no_op()
with tf.Session() as s:
op3.aval()
单个 sess.run
调用中的变量顺序没有任何意义。
sess.run([assign1, assign2, ...])
相当于
sess.run([..., assign2, assign1, ...])
真正重要的是您正在执行的节点之间的关系。
在您的示例中,c.eval()
的输出是 eye,因为:
- sess.run([assign_c, assign_b]) 调用
assign_c
和 assign_b
.
assign_b
取决于 a
.
assign_c
取决于 b
.
- 因此
c
取决于 b
又取决于 a
因此:-> 首先解决 a
。
我已经在 Tensowrflow 图中实现了一些张量初始化作为赋值网。同时,这些赋值应该以正确的顺序调用,因为一个使用另一个的结果。如果我将分配节点暴露给外部,用户(我自己也是)应该 运行 通过会话调用
sess.run([assign1, assign2, ...])
顺序正确,可能会出错。我可以将分配序列加入单个操作并仅公开它吗运行?
更新
我写了这段代码,发现它打印了眼睛?为什么?它应该打印 b
的随机初始化,不是吗?
import tensorflow as tf
tf.reset_default_graph()
a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2))
c = tf.get_variable("c", shape=(2,2))
assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run([assign_c, assign_b])
print(c.eval())
更新 2
下面的代码显示我无法使用 group
控制 assignmen 顺序:
import tensorflow as tf
tf.reset_default_graph()
a = tf.eye(2, 2)
b = tf.get_variable("b", shape=(2,2), initializer=tf.zeros_initializer)
c = tf.get_variable("c", shape=(2,2))
assign_c = tf.assign(c, b)
assign_b = tf.assign(b, a)
incorrect_init = tf.group(assign_b, assign_c)
correct_init = tf.group(assign_c, assign_b)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run([incorrect_init])
#sess.run([correct_init])
print(c.eval())
结果总是
[[ 1. 0.]
[ 0. 1.]]
不管我叫correct_init
还是incorrect_init
。为什么?如何强制排序?
您可以使用 tf.group 对运算符进行分组。如果有任何依赖关系,Tensorflow 将为您解决所有依赖关系。
更新
c <- assign_c =>
c <- b =>
c <- assign_b =>
c <- a
即使您省略了 sess.run([assign_c, assign_b])
步骤。
更新 2 如果您需要保持 3 个独立的张量或运算符的执行顺序,您可以使用 control_dependencies,但前提是没有任何依赖关系。
with tf.control_dependencies([first]):
op1 = tf.no_op()
with tf.control_dependencies([op1, second]):
op2 = tf.no_op()
with tf.control_dependencies([op2, third]):
op3 = tf.no_op()
with tf.Session() as s:
op3.aval()
单个 sess.run
调用中的变量顺序没有任何意义。
sess.run([assign1, assign2, ...])
相当于
sess.run([..., assign2, assign1, ...])
真正重要的是您正在执行的节点之间的关系。
在您的示例中,c.eval()
的输出是 eye,因为:
- sess.run([assign_c, assign_b]) 调用
assign_c
和assign_b
. assign_b
取决于a
.assign_c
取决于b
.- 因此
c
取决于b
又取决于a
因此:-> 首先解决 a
。