非常奇怪的张量流行为
Very strange tensorflow behavior
我有非常简单的行会产生非常奇怪的意外行为:
import tensorflow as tf
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a1, a2]):
t = y+0
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
预期的是
t=6
y=6
t=14
y=14
t=30
y=30
t=62
y=62
但首先 运行,我得到:
t=6
y=6
t=13
y=13
t=26
y=26
t=27
y=27
第二个运行,我得到:
t=3
y=3
t=6
y=6
t=14
y=14
t=15
y=15
第三个运行,我得到:
t=6
y=6
t=14
y=14
t=28
y=28
t=56
y=56
很可笑,多个运行s产生多个不同的输出序列,很奇怪,有人可以帮忙吗?
编辑:更改为
import tensorflow as tf
import os
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
a3 = tf.group(a1, a2)
with tf.control_dependencies([a3]):
t = tf.identity(y+0)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
...仍然无法正常工作。
这段代码还是很奇怪:
a1 = tf.assign(y, y + 1)
with tf.control_dependencies([a1]):
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a2]):
t = tf.identity(y)
... 正常工作,但只需将 a2
移动到
之前
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a1]):
with tf.control_dependencies([a2]):
t = tf.identity(y)
...没有。
您的方法的问题在于 a1
和 a2
的顺序也很重要:您希望 a1
在 a2
之前计算。 tf.control_dependencies([a1, a2])
保证 t
在 a1
和 a2
之后执行,但它们本身可以按任何顺序计算。
我会选择这样的显式依赖:
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
with tf.control_dependencies([a1]):
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a2]):
t = tf.identity(y)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
输出:
t=6
y=6
t=14
y=14
t=30
y=30
t=62
y=62
我有非常简单的行会产生非常奇怪的意外行为:
import tensorflow as tf
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a1, a2]):
t = y+0
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
预期的是
t=6
y=6
t=14
y=14
t=30
y=30
t=62
y=62
但首先 运行,我得到:
t=6
y=6
t=13
y=13
t=26
y=26
t=27
y=27
第二个运行,我得到:
t=3
y=3
t=6
y=6
t=14
y=14
t=15
y=15
第三个运行,我得到:
t=6
y=6
t=14
y=14
t=28
y=28
t=56
y=56
很可笑,多个运行s产生多个不同的输出序列,很奇怪,有人可以帮忙吗?
编辑:更改为
import tensorflow as tf
import os
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
a3 = tf.group(a1, a2)
with tf.control_dependencies([a3]):
t = tf.identity(y+0)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
...仍然无法正常工作。
这段代码还是很奇怪:
a1 = tf.assign(y, y + 1)
with tf.control_dependencies([a1]):
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a2]):
t = tf.identity(y)
... 正常工作,但只需将 a2
移动到
a1 = tf.assign(y, y + 1)
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a1]):
with tf.control_dependencies([a2]):
t = tf.identity(y)
...没有。
您的方法的问题在于 a1
和 a2
的顺序也很重要:您希望 a1
在 a2
之前计算。 tf.control_dependencies([a1, a2])
保证 t
在 a1
和 a2
之后执行,但它们本身可以按任何顺序计算。
我会选择这样的显式依赖:
y = tf.Variable(2, dtype=tf.int32)
a1 = tf.assign(y, y + 1)
with tf.control_dependencies([a1]):
a2 = tf.assign(y, y * 2)
with tf.control_dependencies([a2]):
t = tf.identity(y)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(4):
print('t=%d' % sess.run(t))
print('y=%d' % sess.run(y))
输出:
t=6
y=6
t=14
y=14
t=30
y=30
t=62
y=62