python – TensorFlow while_loop将变量转换为常量?

我正在尝试更新嵌套的while_loop()中的二维张量.但是,当将变量传递给第二个循环时,我无法使用tf.assign()更新它,因为它会抛出此错误:

ValueError: Sliced assignment is only supported for variables

如果我在while_loop之外创建变量并且仅在第一个循环中使用它,它会以某种方式正常工作.

如何在第二个while循环中修改我的2D tf变量?
(我使用的是python 2.7和TensorFlow 1.2)

我的代码:

import tensorflow as tf
import numpy as np

tf.reset_default_graph()

BATCH_SIZE = 10
LENGTH_MAX_OUTPUT = 31

it_batch_nr = tf.constant(0)
it_row_nr = tf.Variable(0, dtype=tf.int32)
it_col_nr = tf.constant(0)
cost = tf.constant(0)

it_batch_end = lambda it_batch_nr, cost: tf.less(it_batch_nr, BATCH_SIZE)
it_row_end = lambda it_row_nr, cost_matrix: tf.less(it_row_nr, LENGTH_MAX_OUTPUT+1)

def iterate_batch(it_batch_nr, cost):
    cost_matrix = tf.Variable(np.ones((LENGTH_MAX_OUTPUT+1, LENGTH_MAX_OUTPUT+1)), dtype=tf.float32)
    it_rows, cost_matrix = tf.while_loop(it_row_end, iterate_row, [it_row_nr, cost_matrix])
    cost = cost_matrix[0,0] # IS 1.0, SHOULD BE 100.0
    return tf.add(it_batch_nr,1), cost

def iterate_row(it_row_nr, cost_matrix):
    # THIS THROWS AN ERROR:
    cost_matrix[0,0].assign(100.0)
    return tf.add(it_row_nr,1), cost_matrix

it_batch = tf.while_loop(it_batch_end, iterate_batch, [it_batch_nr, cost])

sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
out = sess.run(it_batch)
print(out)

最佳答案 tf.Variable对象不能在while循环中用作循环变量,因为循环变量的实现方式不同.

因此,要么在循环外部创建变量,并在每次迭代时使用tf.assign自行更新,要么像循环变量一样手动跟踪更新(通过从循环lambdas返回更新的值,在您的情况下使用值)从内部循环作为外部循环的新值).

点赞