了解肌腱流中的while循環。

[英]Understanding the while loop in Tensorflow


I am using the Python API for Tensorflow. I am trying to implement the Rosenbrock function given below without the use of a Python loop:

我正在使用Python API進行Tensorflow。我正在嘗試在不使用Python循環的情況下實現Rosenbrock函數:

Rosenbrock function

My current implementation is as follows:

我目前的執行情況如下:

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

I have tried implementing the summation in a tf.while_loop(); however, I found the API somewhat unintuitive when it comes to using an index integer that is meant to remain separate from the data. The example given in the documentation uses the data as the index (or vice-versa):

我已經嘗試在tf.while_loop()中實現求和;然而,我發現在使用與數據保持分離的索引整數時,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])

1 个解决方案

#1


10  

This can be achieved using the tf.while_loop() and standard tuples as per the second example in the documentation.

這可以通過使用tf.while_loop()和標准元組來實現,這是文檔中第二個例子。

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]

It is important to note that the index increment should occur in the body of the loop similar to a standard while loop. In the solution given, it is the first item in the tuple returned by the body() function.

需要注意的是,索引增量應該出現在類似於標准while循環的循環體中。在給定的解決方案中,它是body()函數返回的tuple中的第一項。

Additionally, the loop condition function must allot a parameter for the summation although it is not used in this particular example.

此外,循環條件函數還必須為求和提供一個參數,盡管在這個特殊的例子中沒有使用它。

关注微信公众号

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2017/05/04/7deed5cfbbb4d0f7906dc48b888f0d60.html



 
粤ICP备14056181号  © 2014-2020 ITdaan.com