Spec-Zone.ru › TensorFlow 2.9

tf.data.experimental.bucket_by_sequence_length

Просмотреть исходный код на GitHub

Преобразование, которое группирует элементы в Dataset по длине. (устаревшее)

Просмотреть псевдонимы

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.data.experimental.bucket_by_sequence_length

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
)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: Используйте 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]]
Аргументы
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. По умолчанию заполнение нулями.
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/versions/r2.9/api_docs/python/tf/data/experimental/bucket_by_sequence_length

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API