例如,假设我通过TFDS使用Librispeech数据集(或任何数据集,包括数据长度不同的序列),然后用于padded_batch
创建批处理,例如:
import tensorflow_datasets as tfds
dataset = tfds.load(name="librispeech", split="train_clean100")
dataset = dataset.shuffle(1024)
dataset = dataset.padded_batch(32)
现在,当遍历结果数据集时,即遍历(填充的)批次,我如何知道填充的批次中的原始序列长度?还是此时此信息丢失了?我将如何扩展管道以将其包括在内?是否有类似的特殊数据集AddSeqLengthInfoDataset
?这将需要运行之前的padded_batch
,对不对?(这基本上等同于我对TF的问题,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
该字段的值作为掩盖填充值。
另一种选择是简单的一些特殊传递padding_values
到padded_batch
不能出现在实际的数据,例如-1
或者nan
,而是取决于这些是否实际上是为你的问题无效值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句