我从这个链接中关注了另一个关于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]
吗?