【问题标题】:tf.data.Iterator.get_next(): How to advance in tf.while_loop?tf.data.Iterator.get_next():如何在 tf.while_loop 中推进?
【发布时间】:2018-05-08 15:40:46
【问题描述】:

目前我尝试在 Tensorflow while 循环中实现所有训练,但我遇到了 Tensorflow 数据集 API 的迭代器问题。

通常,在调用 sess.run() 时,Iterator.get_next() 会前进到下一个元素。 但是,我需要在一次运行中前进到下一个元素。我该怎么做?

下面的小例子说明了我的问题:

import tensorflow as tf
import numpy as np


def for_loop(condition, modifier, body_op, idx=0):
    idx = tf.convert_to_tensor(idx)

    def body(i):
        with tf.control_dependencies([body_op(i)]):
            return [modifier(i)]

    # do the loop:
    loop = tf.while_loop(condition, body, [idx])
    return loop


x = np.arange(10)

data = tf.data.Dataset.from_tensor_slices(x)
data = data.repeat()

iterator = data.make_initializable_iterator()
smpl = iterator.get_next()

loop = for_loop(
    condition=lambda i: tf.less(i, 5),
    modifier=lambda i: tf.add(i, 1),
    body_op=lambda i: tf.Print(smpl, [smpl], message="This is sample: ")
)

sess = tf.InteractiveSession()
sess.run(iterator.initializer)
sess.run(loop)

输出:

This is sample: [0]
This is sample: [0]
This is sample: [0]
This is sample: [0]
This is sample: [0]

我总是得到完全相同的元素。

【问题讨论】:

    标签: python python-3.x tensorflow


    【解决方案1】:

    每次想要“在一次运行中迭代”时,您都需要调用 iterator.get_next()

    例如,在您的玩具示例中,只需将您的 body_op 替换为:

     body_op=lambda i: tf.Print(i, [iterator.get_next()], message="This is sample: ")
    # This is sample: [0]
    # This is sample: [1]
    # This is sample: [2]
    # This is sample: [3]
    # This is sample: [4]
    

    【讨论】:

    • 好的,这是有道理的。但是如何将 iterator.get_next() 的值放入我的模型中?例如。 a,b,c = iterator.get_next(); do_some_fancy_stuff(a,b,c); train() 在这里,a,b 和 c 不会被更新。
    • 我刚刚得到了解决方案:我必须在应该使用iterator.get_next()body_op 中定义所有内容。然后依赖的操作也会得到更新的值。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多