一種按長度對Dataset
中的元素進行分桶的轉換。 (已棄用)
用法
tf.data.experimental.bucket_by_sequence_length(
element_length_func, bucket_boundaries, bucket_batch_sizes, padded_shapes=None,
padding_values=None, pad_to_bucket_boundary=False, no_padding=False,
drop_remainder=False
)
參數
-
element_length_func
從Dataset
到tf.int32
中的元素的函數,確定元素的長度,這將確定它進入的桶。 -
bucket_boundaries
list<int>
,桶的上長度邊界。 -
bucket_batch_sizes
list<int>
,每個桶的批量大小。長度應為len(bucket_boundaries) + 1
。 -
padded_shapes
tf.TensorShape
的嵌套結構傳遞給tf.data.Dataset.padded_batch
。如果未提供,將使用dataset.output_shapes
,這將導致可變長度維度在每批中被填充到最大長度。 -
padding_values
要填充的值,傳遞給tf.data.Dataset.padded_batch
。默認填充為 0。 -
pad_to_bucket_boundary
bool,如果False
,將批量填充未知大小的尺寸到最大長度。如果True
,會將未知大小的維度填充到桶邊界減 1(即每個桶中的最大長度),並且調用者必須確保源Dataset
不包含任何長度超過max(bucket_boundaries)
的元素。 -
no_padding
bool
,表示是否填充批量特征(特征需要是tf.sparse.SparseTensor
類型或相同形狀)。 -
drop_remainder
(可選。)一個tf.bool
標量tf.Tensor
,表示在最後一批少於batch_size
元素的情況下是否應刪除它;默認行為是不丟棄較小的批次。
返回
-
一個
Dataset
轉換函數,可以傳遞給tf.data.Dataset.apply
。
拋出
-
ValueError
如果len(bucket_batch_sizes) != len(bucket_boundaries) + 1
.
警告:此函數已棄用。它將在未來的版本中刪除。更新說明:使用 tf.data.Dataset.bucket_by_sequence_length(...)
。
Dataset
的元素按長度分組在一起,然後進行填充和批處理。
這對於元素具有可變長度的序列任務很有用。將具有相似長度的元素組合在一起可以減少批次中填充的總比例,從而提高訓練步驟的效率。
下麵是一個基於序列長度將輸入數據分桶到 3 個桶“[0, 3), [3, 5), [5, inf)” 的示例,批量大小為 2。
elements = [
[0], [1, 2, 3, 4], [5, 6, 7],
[7, 8, 9, 10, 11], [13, 14, 15, 16, 19, 20], [21, 22]]
dataset = tf.data.Dataset.from_generator(
lambda:elements, tf.int64, output_shapes=[None])
dataset = dataset.apply(
tf.data.experimental.bucket_by_sequence_length(
element_length_func=lambda elem:tf.shape(elem)[0],
bucket_boundaries=[3, 5],
bucket_batch_sizes=[2, 2, 2]))
for elem in dataset.as_numpy_iterator():
print(elem)
[[1 2 3 4]
[5 6 7 0]]
[[ 7 8 9 10 11 0]
[13 14 15 16 19 20]]
[[ 0 0]
[21 22]]
也有可能將數據集填充到桶邊界。您還可以在填充數據時提供要使用的值。下麵的示例使用-1
作為填充,它還顯示輸入數據被分桶到兩個桶“[0,3],[4,6]”。
elements = [
[0], [1, 2, 3, 4], [5, 6, 7],
[7, 8, 9, 10, 11], [13, 14, 15, 16, 19, 20], [21, 22]]
dataset = tf.data.Dataset.from_generator(
lambda:elements, tf.int32, output_shapes=[None])
dataset = dataset.apply(
tf.data.experimental.bucket_by_sequence_length(
element_length_func=lambda elem:tf.shape(elem)[0],
bucket_boundaries=[4, 7],
bucket_batch_sizes=[2, 2, 2],
pad_to_bucket_boundary=True,
padding_values=-1))
for elem in dataset.as_numpy_iterator():
print(elem)
[[ 0 -1 -1]
[ 5 6 7]]
[[ 1 2 3 4 -1 -1]
[ 7 8 9 10 11 -1]]
[[21 22 -1]]
[[13 14 15 16 19 20]]
使用pad_to_bucket_boundary
選項時,可以看出並非總是可以保持桶批量大小。您可以使用選項 drop_remainder
刪除不保持存儲桶批量大小的批次。使用與上述示例相同的輸入數據,您將獲得以下結果。
elements = [
[0], [1, 2, 3, 4], [5, 6, 7],
[7, 8, 9, 10, 11], [13, 14, 15, 16, 19, 20], [21, 22]]
dataset = tf.data.Dataset.from_generator(
lambda:elements, tf.int32, output_shapes=[None])
dataset = dataset.apply(
tf.data.experimental.bucket_by_sequence_length(
element_length_func=lambda elem:tf.shape(elem)[0],
bucket_boundaries=[4, 7],
bucket_batch_sizes=[2, 2, 2],
pad_to_bucket_boundary=True,
padding_values=-1,
drop_remainder=True))
for elem in dataset.as_numpy_iterator():
print(elem)
[[ 0 -1 -1]
[ 5 6 7]]
[[ 1 2 3 4 -1 -1]
[ 7 8 9 10 11 -1]]
相關用法
- Python tf.data.experimental.RandomDataset.group_by_window用法及代碼示例
- Python tf.data.experimental.SqlDataset.enumerate用法及代碼示例
- Python tf.data.experimental.make_saveable_from_iterator用法及代碼示例
- Python tf.data.experimental.SqlDataset.zip用法及代碼示例
- Python tf.data.experimental.Counter用法及代碼示例
- Python tf.data.experimental.SqlDataset.shard用法及代碼示例
- Python tf.data.experimental.CsvDataset.window用法及代碼示例
- Python tf.data.experimental.RandomDataset.cache用法及代碼示例
- Python tf.data.experimental.SqlDataset.snapshot用法及代碼示例
- Python tf.data.experimental.CsvDataset.apply用法及代碼示例
- Python tf.data.experimental.DatasetInitializer用法及代碼示例
- Python tf.data.experimental.ignore_errors用法及代碼示例
- Python tf.data.experimental.unbatch用法及代碼示例
- Python tf.data.experimental.RandomDataset.map用法及代碼示例
- Python tf.data.experimental.CsvDataset.flat_map用法及代碼示例
- Python tf.data.experimental.assert_cardinality用法及代碼示例
- Python tf.data.experimental.CsvDataset.random用法及代碼示例
- Python tf.data.experimental.save用法及代碼示例
- Python tf.data.experimental.CsvDataset.cardinality用法及代碼示例
- Python tf.data.experimental.CsvDataset.interleave用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.data.experimental.bucket_by_sequence_length。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。