我正在使用map(_:)
。我试图在不使用Python循环的情况下实现下面给出的reduce(_:_:)
:
我目前的实施如下:
def rosenbrock(data_tensor):
columns = tf.unstack(data_tensor)
summation = 0
for i in range(1, len(columns) - 1):
first_term = tf.square(tf.subtract(columns[i + 1], tf.square(columns[i])))
second_term = tf.square(tf.subtract(columns[i], 1.0))
summation += tf.add(tf.multiply(100.0, first_term), second_term)
return summation
我尝试在Rosenbrock function中实现求和;但是,我发现在使用一个与数据保持独立的索引整数时,API有点不直观。 中给出的示例使用数据作为索引(反之亦然):
i = tf.constant(0)
c = lambda i: tf.less(i, 10)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
答案 0 :(得分:13)
根据tf.while_loop()
中的第二个示例,可以使用tf.while_loop()
和标准documentation来实现。
def rosenbrock(data_tensor):
columns = tf.unstack(data_tensor)
# Track both the loop index and summation in a tuple in the form (index, summation)
index_summation = (tf.constant(1), tf.constant(0.0))
# The loop condition, note the loop condition is 'i < n-1'
def condition(index, summation):
return tf.less(index, tf.subtract(tf.shape(columns)[0], 1))
# The loop body, this will return a result tuple in the same form (index, summation)
def body(index, summation):
x_i = tf.gather(columns, index)
x_ip1 = tf.gather(columns, tf.add(index, 1))
first_term = tf.square(tf.subtract(x_ip1, tf.square(x_i)))
second_term = tf.square(tf.subtract(x_i, 1.0))
summand = tf.add(tf.multiply(100.0, first_term), second_term)
return tf.add(index, 1), tf.add(summation, summand)
# We do not care about the index value here, return only the summation
return tf.while_loop(condition, body, index_summation)[1]
重要的是要注意,索引增量应该出现在循环体中,类似于标准的while循环。在给定的解决方案中,它是body()
函数返回的元组中的第一个项。
此外,循环条件函数必须为求和分配一个参数,尽管在此特定示例中未使用该参数。