如何从tf.data.Dataset`的填充批次中获得序列长度?

问题描述 投票:2回答:1

例如假设我使用Librispeech dataset via TFDS(或任何数据集,包括数据长度不同的序列),然后使用padded_batch创建批次,例如像这样:

padded_batch

现在,当遍历结果数据集时,即遍历(填充的)批次,我如何知道填充的批次中的原始序列长度?还是此时此信息丢失了?我将如何扩展管道以将其包括在内?是否有类似import tensorflow_datasets as tfds dataset = tfds.load(name="librispeech", split="train_clean100") dataset = dataset.shuffle(1024) dataset = dataset.padded_batch(32) 的特殊数据集?这需要运行[[before AddSeqLengthInfoDataset,对吧?(这基本上等于padded_batch,但等于my question for TF PaddingFIFOQueue。)

有一些例子吗? (我有点纳闷,我对此一无所获。我认为当您处理序列时,这是一个相当标准的要求,您是否需要有关原始序列长度的信息?)
tensorflow tensorflow-datasets
1个回答
2
投票
您可以将新字段添加到保存序列大小的数据集中,例如:

PaddingFIFOQueue

输出:

tf.data.Dataset

然后您可以将例如import tensorflow as tf

# Make a dataset with variable-size data
def generate_data():
    for i in range(10):
        yield {'id': i, 'data': range(i % 5)}
ds = tf.data.Dataset.from_generator(generate_data,
                                    {'id': tf.int32, 'data': tf.int32},
                                    {'id': [], 'data': [None]})
# Add field with size of data
ds = ds.map(lambda item: {**item, 'size': tf.shape(item['data'])[0]})
# Padded batch
ds = ds.padded_batch(3)
# Show dataset
for batch in ds:
    tf.print(batch)
与该字段的值一起使用以掩盖填充值。

[另一种选择是简单地将某些不能显示在实际数据中的特殊{'data': [[0 0] [0 0] [0 1]], 'id': [0 1 2], 'size': [0 1 2]} {'data': [[0 1 2 0] [0 1 2 3] [0 0 0 0]], 'id': [3 4 5], 'size': [3 4 0]} {'data': [[0 0 0] [0 1 0] [0 1 2]], 'id': [6 7 8], 'size': [1 2 3]} {'data': [[0 1 2 3]], 'id': [9], 'size': [4]} 传递给tf.sequence_mask,例如tf.sequence_maskpadding_values,但这取决于您的问题实际上是否是无效值。

© www.soinside.com 2019 - 2024. All rights reserved.