Python 包含散布和更新的tensorflow中while_循环的实现

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,

好的,这个问题与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, 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