例如假设我使用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
。)
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_mask
或padding_values
,但这取决于您的问题实际上是否是无效值。