tf.data.experimental.bucket_by_sequence_length
Трансформация, которая группирует элементы в 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
)
Элементы 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]]
| Аргументы | |
|---|---|
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. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/data/experimental/bucket_by_sequence_length