Python 包含散布和更新的tensorflow中while_循环的实现
好的,这个问题与a有关(如果它起作用,也可以被认为是这个问题的答案)。无论如何,我正在尝试实现一个Python 包含散布和更新的tensorflow中while_循环的实现,python,tensorflow,Python,Tensorflow,好的,这个问题与a有关(如果它起作用,也可以被认为是这个问题的答案)。无论如何,我正在尝试实现一个tf.while\u循环,以满足我的需要。我需要在其中应用一个tf.scatter\u and\u update函数,但由于某种原因,它会抛出一个错误 揭示问题的小脚本如下: import tensorflow as tf ref = tf.Variable([[0, 1, 0, 2], [0, 1, 2, 2], [1,
tf.while\u循环
,以满足我的需要。我需要在其中应用一个tf.scatter\u and\u update
函数,但由于某种原因,它会抛出一个错误
揭示问题的小脚本如下:
import tensorflow as tf
ref = tf.Variable([[0, 1, 0, 2],
[0, 1, 2, 2],
[1, 2, 1, 3]], dtype=tf.int32)
true_array = tf.Variable([[1, 1, 1, 1]])
false_array = tf.Variable([[1, 0, 1, 0]])
num_iters = tf.Variable(3, dtype=tf.int32) # 3
def body(ref, true_array, false_array, j, num_iters):
samples = tf.cond(tf.equal(tf.reduce_sum(ref[j, :], axis=0), 1), lambda: true_array, lambda: false_array)
ref = tf.scatter_nd_update(ref, [[j]], samples)
j = tf.add(j, 1)
return ref, true_array, false_array, j, num_iters
cond = lambda ref, true_array, false_array, j, num_iters: tf.less(j, num_iters)
j = tf.Variable(0, dtype=tf.int32) # tf.constant(0)
ref, true_array, false_array, j, num_iters = tf.while_loop(cond, body, [ref, true_array, false_array, j, num_iters])
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print('ref', sess.run(ref))
print('j', sess.run(j))
它抛出了一个错误
AttributeError:“Tensor”对象没有属性“\u lazy\u read”
行内ref=tf.散射和更新(ref,[[j]],样本)
。出于某种原因,我的一个对象是张量
,它不包含\u lazy\u read
属性。这里有一个类似的问题,建议将张量转换为变量,但在我的例子中,它不起作用。我尝试在函数体中使用ref=lambda:tf.Variable(ref)
,但这会引发另一个错误:
AttributeError:“函数”对象没有属性“dtype”
是否有人知道如何在使用分散更新进行循环时实现此
值得注意的是,上面的代码在急切模式下工作得很好
tf版本1.15
编辑:
删除了急切执行模式(错误插入)。在经历了许多挫折和死胡同后,我找到了一个有效的组合解决方案
我应该只使用在地方,它似乎工作良好。不过,我无法具体说明这两者之间的区别。第一条规定:
根据索引将更新分散到现有张量中
而第二个:
将稀疏更新应用于变量中的单个值或切片
然而在我看来,他们似乎完成了同样的工作。无论如何,也许tensorflow团队也有类似的想法,因为这两个版本只有TF2.0版本中的第一个
import tensorflow as tf
ref = tf.Variable([[0, 1, 0, 2],
[0, 1, 2, 2],
[1, 2, 1, 3]], dtype=tf.int32)
true_array = tf.Variable([[1, 1, 1, 1]])
false_array = tf.Variable([[1, 0, 1, 0]])
num_iters = tf.Variable(3, dtype=tf.int32) # 3
def body(ref, true_array, false_array, j, num_iters):
samples = tf.cond(tf.equal(tf.reduce_sum(ref[j, :], axis=0), 1), lambda: true_array, lambda: false_array)
ref = tf.tensor_scatter_nd_update(ref, [[j]], samples)
j = tf.add(j, 1)
return ref, true_array, false_array, j, num_iters
cond = lambda ref, true_array, false_array, j, num_iters: tf.less(j, num_iters)
j = tf.Variable(0, dtype=tf.int32) # tf.constant(0)
ref, true_array, false_array, j, num_iters = tf.while_loop(cond, body, [ref, true_array, false_array, j, num_iters])
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print('ref', sess.run(ref))
print('j', sess.run(j))
输出为:
update [[1 1 1 1]
[1 0 1 0]
[1 0 1 0]]
samples 3