1

我从这个链接中关注了另一个关于tf.data.Dataset.interleave()方法的例子。

import tensorflow as tf
import tensorflow.keras as keras

def do_range(i):
    for j in tf.range(i):
        yield j

ds = tf.data.Dataset.range(10).interleave(
    lambda ind: tf.data.Dataset.from_generator(do_range, args=(ind,), output_types=tf.int64))

我试图理解这个例子,所以我从range(3), range(4), ... 等开始。
例如,

ds = tf.data.Dataset.range(3).interleave(
    lambda ind: tf.data.Dataset.from_generator(do_range, args=(ind,), output_types=tf.int64))
res = [x for x in ds.as_numpy_iterator()]
# This returns [0, 0, 1]
ds = tf.data.Dataset.range(4).interleave(
    lambda ind: tf.data.Dataset.from_generator(do_range, args=(ind,), output_types=tf.int64))
res = [x for x in ds.as_numpy_iterator()]
# This returns [0, 0, 0, 1, 1, 2]
ds = tf.data.Dataset.range(5).interleave(
    lambda ind: tf.data.Dataset.from_generator(do_range, args=(ind,), output_types=tf.int64))
res = [x for x in ds.as_numpy_iterator()]
# This returns [0, 0, 0, 0, 1, 1, 1, 2, 2, 3]

直到range(9),它返回我期望的数据集。
但是从range(10),它没有返回我期望的数据集。

ds = tf.data.Dataset.range(10).interleave(
    lambda ind: tf.data.Dataset.from_generator(do_range, args=(ind,), output_types=tf.int64))
res = [x for x in ds.as_numpy_iterator()]
# This returns [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 2, 4, 4, 4, 4, 3, 5, 5, 5, 4, 6, 6, 5, 7, 6, 7, 8]
# Notice that 0s, 1s, 2s are not gathered..

这里发生了什么?这不应该[0, ..., 0, 1, ..., 1, 2, ..., 2, ..., 8]吗?

4

0 回答 0