是否有像 Dataset.batch() 这样的函数,但对于所有具有不同大小的张量?
Is there a function like Dataset.batch() but for tensors that all have different size?
我正在使用 tf.data.Dataset.from_generator() 函数为 ASR 创建数据集,其中包含音频 wav_file、音频长度 wav_file、转录本和 transcript_len。对于 ML 模型,我需要音频 wav_file 和长度为零填充,因此我已经使用了 .padded_batch() 。现在我需要 .batch() 以外的东西,因为这需要张量具有相同的形状但没有零填充来批处理我的数据集。
我想使用 CTC 损失函数 tf.nn.ctc_loss_v2,它需要转录本和 transcript_len 张量,而不是用零填充,而是批处理。是否有可能对包含不同形状的张量的数据集进行批处理?
def generate_values():
for _, row in df.iterrows():
yield row.wav_filename, row.transcript, len(row.transcript)
def entry_to_features(wav_filename, transcript, transcript_len):
features, features_len = audiofile_to_features(wav_filename)
return features, features_len, transcript, transcript_len
def batch_fn(features, features_len, transcripts, transcript_len):
features = tf.data.Dataset.zip((features, features_len))
features = features.padded_batch(batch_size,
padded_shapes=([None, Config.n_input], []))
trans=tf.data.Dataset.zip((transcripts,
transcript_len)).batch(batch_size) ###PROBLEM:
#### ONLY WORKING WITH BATCH_SIZE=1
return tf.data.Dataset.zip((features, trans))
dataset = tf.data.Dataset.from_generator(generate_values,
output_types=(tf.string,tf.int64, tf.int64))
dataset= dataset.map(entry_to_features)
dataset= dataset.window(batch_size, drop_remainder=True)
dataset= dataset.flat_map(batch_fn)
InvalidArgumentError(回溯见上文):无法在组件 0 中批量处理具有不同形状的张量。第一个元素的形状为 [36],元素 2 的形状为 [34]
如果你想训练 seq2seq 模型并使用 features, transcript
作为训练示例 dataset.window
不是你要使用的。
dataset = tf.data.Dataset.from_generator(generate_values,
output_types=(tf.string, tf.int64, tf.int64))
dataset = dataset.map(entry_to_features)
dataset = dataset.padded_batch(batch_size, padded_shapes=([None, Config.n_input], [], [None], []))
稍后您可以按如下方式使用数据集:
for features, feature_length, labels, label_length in dataset.take(30):
logits, logit_length = model(features, feature_length)
loss = tf.nn.ctc_loss_v2(labels, tf.cast(logits, tf.float32),
label_length, logit_length, logits_time_major=False)
我正在使用 tf.data.Dataset.from_generator() 函数为 ASR 创建数据集,其中包含音频 wav_file、音频长度 wav_file、转录本和 transcript_len。对于 ML 模型,我需要音频 wav_file 和长度为零填充,因此我已经使用了 .padded_batch() 。现在我需要 .batch() 以外的东西,因为这需要张量具有相同的形状但没有零填充来批处理我的数据集。
我想使用 CTC 损失函数 tf.nn.ctc_loss_v2,它需要转录本和 transcript_len 张量,而不是用零填充,而是批处理。是否有可能对包含不同形状的张量的数据集进行批处理?
def generate_values():
for _, row in df.iterrows():
yield row.wav_filename, row.transcript, len(row.transcript)
def entry_to_features(wav_filename, transcript, transcript_len):
features, features_len = audiofile_to_features(wav_filename)
return features, features_len, transcript, transcript_len
def batch_fn(features, features_len, transcripts, transcript_len):
features = tf.data.Dataset.zip((features, features_len))
features = features.padded_batch(batch_size,
padded_shapes=([None, Config.n_input], []))
trans=tf.data.Dataset.zip((transcripts,
transcript_len)).batch(batch_size) ###PROBLEM:
#### ONLY WORKING WITH BATCH_SIZE=1
return tf.data.Dataset.zip((features, trans))
dataset = tf.data.Dataset.from_generator(generate_values,
output_types=(tf.string,tf.int64, tf.int64))
dataset= dataset.map(entry_to_features)
dataset= dataset.window(batch_size, drop_remainder=True)
dataset= dataset.flat_map(batch_fn)
InvalidArgumentError(回溯见上文):无法在组件 0 中批量处理具有不同形状的张量。第一个元素的形状为 [36],元素 2 的形状为 [34]
如果你想训练 seq2seq 模型并使用 features, transcript
作为训练示例 dataset.window
不是你要使用的。
dataset = tf.data.Dataset.from_generator(generate_values,
output_types=(tf.string, tf.int64, tf.int64))
dataset = dataset.map(entry_to_features)
dataset = dataset.padded_batch(batch_size, padded_shapes=([None, Config.n_input], [], [None], []))
稍后您可以按如下方式使用数据集:
for features, feature_length, labels, label_length in dataset.take(30):
logits, logit_length = model(features, feature_length)
loss = tf.nn.ctc_loss_v2(labels, tf.cast(logits, tf.float32),
label_length, logit_length, logits_time_major=False)