Spec-Zone.ru › TensorFlow

tf.compat.v1.data.experimental.SqlDataset

Dataset, состоящий из результатов SQL-запроса.

Наследует от: Dataset, Dataset

tf.compat.v1.data.experimental.SqlDataset(
    driver_name, data_source_name, query, output_types
)
Аргументы
driver_name 0-D тензор tf.string, содержащий тип базы данных. В настоящее время поддерживается только значение 'sqlite'.
data_source_name 0-D тензор tf.string, содержащий строку подключения к базе данных.
query 0-D тензор tf.string, содержащий SQL-запрос для выполнения.
output_types Кортеж объектов tf.DType, представляющих типы столбцов, возвращаемых query.
Атрибуты
element_spec Спецификация типа элемента этого набора данных.
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset.element_spec
TensorSpec(shape=(), dtype=tf.int32, name=None)

Для получения дополнительной информации ознакомьтесь с этим руководством.

output_classes Возвращает класс каждого компонента элемента этого набора данных. (устарело)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте tf.compat.v1.data.get_output_classes(dataset).
output_shapes Возвращает форму каждого компонента элемента этого набора данных. (устарело)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте tf.compat.v1.data.get_output_shapes(dataset).
output_types Возвращает тип каждого компонента элемента этого набора данных. (устарело)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте tf.compat.v1.data.get_output_types(dataset).

Методы

apply

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

apply(
    transformation_func
) -> 'DatasetV2'

Применяет функцию преобразования к этому набору данных.

apply позволяет объединять пользовательские преобразования Dataset в цепочку, которые представлены в виде функций, принимающих один аргумент Dataset и возвращающих преобразованный Dataset.

dataset = tf.data.Dataset.range(100)
def dataset_fn(ds):
  return ds.filter(lambda x: x < 5)
dataset = dataset.apply(dataset_fn)
list(dataset.as_numpy_iterator())
[0, 1, 2, 3, 4]
Аргументы
transformation_func Функция, которая принимает один аргумент Dataset и возвращает Dataset.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

as_numpy_iterator

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

as_numpy_iterator()

Возвращает итератор, который преобразует все элементы набора данных в numpy.

Используйте as_numpy_iterator для проверки содержимого вашего набора данных. Чтобы увидеть формы и типы элементов, выводите элементы набора данных напрямую вместо использования as_numpy_iterator.

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
for element in dataset:
  print(element)
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)

Этот метод требует выполнения в режиме eager execution, а element_spec набора данных должен содержать только компоненты TensorSpec.

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
for element in dataset.as_numpy_iterator():
  print(element)
1
2
3
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
print(list(dataset.as_numpy_iterator()))
[1, 2, 3]

as_numpy_iterator() сохраняет вложенную структуру элементов набора данных.

dataset = tf.data.Dataset.from_tensor_slices({'a': ([1, 2], [3, 4]),
                                              'b': [5, 6]})
list(dataset.as_numpy_iterator()) == [{'a': (1, 3), 'b': 5},
                                      {'a': (2, 4), 'b': 6}]
True
Возвращает
Итерируемый объект по элементам набора данных, тензоры которых преобразованы в массивы numpy.
Исключения
TypeError если элемент содержит значение, отличное от Tensor.
RuntimeError если режим eager execution не включен.

batch

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

batch(
    batch_size,
    drop_remainder=False,
    num_parallel_calls=None,
    deterministic=None,
    name=None
) -> 'DatasetV2'

Объединяет последовательные элементы этого набора данных в пакеты (батчи).

dataset = tf.data.Dataset.range(8)
dataset = dataset.batch(3)
list(dataset.as_numpy_iterator())
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7])]
dataset = tf.data.Dataset.range(8)
dataset = dataset.batch(3, drop_remainder=True)
list(dataset.as_numpy_iterator())
[array([0, 1, 2]), array([3, 4, 5])]

Компоненты результирующего элемента будут иметь дополнительное внешнее измерение, равное batch_size (или N % batch_size для последнего элемента, если batch_size не делит количество входных элементов N нацело и drop_remainder установлено в False). Если ваша программа требует, чтобы батчи имели одинаковое внешнее измерение, вам следует установить аргумент drop_remainder в True, чтобы предотвратить создание батча меньшего размера.

Примечание: Если ваша программа требует, чтобы данные имели статически известную форму (например, при использовании XLA), вам следует использовать drop_remainder=True. Без drop_remainder=True форма выходного набора данных будет иметь неизвестное ведущее измерение из-за возможности образования меньшего финального батча.
Аргументы
batch_size Скалярный tf.Tensor типа tf.int64, представляющий количество последовательных элементов этого набора данных для объединения в один батч.
drop_remainder (Необязательно.) Скалярный tf.Tensor типа tf.bool, определяющий, следует ли отбрасывать последний батч, если в нем меньше batch_size элементов; поведение по умолчанию — не отбрасывать батч меньшего размера.
num_parallel_calls (Необязательно.) Скалярный tf.Tensor типа tf.int64, представляющий количество батчей для асинхронного параллельного вычисления. Если не указано, батчи будут вычисляться последовательно. Если используется значение tf.data.AUTOTUNE, то количество параллельных вызовов устанавливается динамически в зависимости от доступных ресурсов.
deterministic (Необязательно.) Если задан num_parallel_calls и указан этот булев параметр (True или False), он управляет порядком, в котором преобразование выдает элементы. Если установлено значение False, преобразованию разрешается выдавать элементы не по порядку ради повышения производительности в ущерб детерминизму. Если не указано, поведение определяется параметром tf.data.Options.deterministic (по умолчанию True).
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

bucket_by_sequence_length

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

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,
    name=None
) -> 'DatasetV2'

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

Элементы Dataset группируются по длине, а затем дополняются (pad) и объединяются в батчи.

Это полезно для задач с последовательностями, в которых элементы имеют переменную длину. Группировка элементов с похожей длиной уменьшает общую долю дополнения (padding) в пакете, что повышает эффективность шага обучения.

Ниже приведен пример распределения входных данных по 3 корзинам (buckets) "[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.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]]
Аргументы
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.Tensor типа tf.bool, определяющий, следует ли отбрасывать последний батч, если в нем меньше batch_size элементов; поведение по умолчанию — не отбрасывать батч меньшего размера.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.
Исключения
ValueError если len(bucket_batch_sizes) != len(bucket_boundaries) + 1.

cache

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

cache(
    filename='', name=None
) -> 'DatasetV2'

Кэширует элементы в этом наборе данных.

При первой итерации по набору данных его элементы будут закэшированы либо в указанном файле, либо в оперативной памяти. Последующие итерации будут использовать кэшированные данные.

Примечание: Чтобы гарантировать финализацию кэша, входной набор данных должен быть пройден полностью, пока он не вызовет StopIteration. В противном случае последующие итерации могут не использовать кэшированные данные.
dataset = tf.data.Dataset.range(5)
dataset = dataset.map(lambda x: x**2)
dataset = dataset.cache()
# The first time reading through the data will generate the data using
# `range` and `map`.
list(dataset.as_numpy_iterator())
[0, 1, 4, 9, 16]
# Subsequent iterations read from the cache.
list(dataset.as_numpy_iterator())
[0, 1, 4, 9, 16]

При кэшировании в файл кэшированные данные сохраняются между запусками. Даже первая итерация по данным будет читать из файла кэша. Изменение входного конвейера до вызова .cache() не возымеет эффекта до тех пор, пока файл кэша не будет удален или имя файла не будет изменено.

dataset = tf.data.Dataset.range(5)
dataset = dataset.cache("/path/to/file")
list(dataset.as_numpy_iterator())
# [0, 1, 2, 3, 4]
dataset = tf.data.Dataset.range(10)
dataset = dataset.cache("/path/to/file")  # Same file!
list(dataset.as_numpy_iterator())
# [0, 1, 2, 3, 4]
Примечание: cache будет выдавать абсолютно одинаковые элементы во время каждой итерации по набору данных. Если вы хотите рандомизировать порядок итерации, убедитесь, что вызываете shuffle после вызова cache.
Аргументы
filename Скалярный tf.Tensor типа tf.string, представляющий имя каталога в файловой системе для кэширования элементов в этом наборе данных. Если имя файла не указано, набор данных будет кэшироваться в памяти.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

cardinality

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

cardinality()

Возвращает мощность (количество элементов) набора данных, если она известна.

cardinality может вернуть tf.data.INFINITE_CARDINALITY, если набор данных содержит бесконечное количество элементов, или tf.data.UNKNOWN_CARDINALITY, если анализ не смог определить количество элементов в наборе данных (например, когда источником набора данных является файл).

dataset = tf.data.Dataset.range(42)
print(dataset.cardinality().numpy())
42
dataset = dataset.repeat()
cardinality = dataset.cardinality()
print((cardinality == tf.data.INFINITE_CARDINALITY).numpy())
True
dataset = dataset.filter(lambda x: True)
cardinality = dataset.cardinality()
print((cardinality == tf.data.UNKNOWN_CARDINALITY).numpy())
True
Возвращает
Скалярный Tensor типа tf.int64, представляющий мощность набора данных. Если мощность бесконечна или неизвестна, cardinality возвращает именованные константы tf.data.INFINITE_CARDINALITY и tf.data.UNKNOWN_CARDINALITY соответственно.

choose_from_datasets

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

@staticmethod
choose_from_datasets(
    datasets, choice_dataset, stop_on_empty_dataset=True
) -> 'DatasetV2'

Создает набор данных, который детерминированно выбирает элементы из datasets.

Например, для следующих наборов данных:

datasets = [tf.data.Dataset.from_tensors("foo").repeat(),
            tf.data.Dataset.from_tensors("bar").repeat(),
            tf.data.Dataset.from_tensors("baz").repeat()]

# Define a dataset containing `[0, 1, 2, 0, 1, 2, 0, 1, 2]`.
choice_dataset = tf.data.Dataset.range(3).repeat(3)

result = tf.data.Dataset.choose_from_datasets(datasets, choice_dataset)

Элементами result будут:

"foo", "bar", "baz", "foo", "bar", "baz", "foo", "bar", "baz"
Аргументы
datasets Непустой список объектов tf.data.Dataset с совместимой структурой.
choice_dataset Объект tf.data.Dataset из скалярных тензоров tf.int64 со значениями между 0 и len(datasets) - 1.
stop_on_empty_dataset Если True, выбор останавливается при обнаружении пустого набора данных. Если False, пустые наборы данных пропускаются. Рекомендуется установить значение True. В противном случае выбранные элементы сначала соответствуют намерениям пользователя, но могут измениться по мере опустошения входных наборов данных. Это может быть трудно обнаружить, поскольку изначально набор данных выглядит корректным. По умолчанию True.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.
Исключения
TypeError Если datasets или choice_dataset имеет неверный тип.
ValueError Если datasets пуст.

concatenate

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

concatenate(
    dataset, name=None
) -> 'DatasetV2'

Создает Dataset путем конкатенации заданного набора данных с этим набором данных.

a = tf.data.Dataset.range(1, 4)  # ==> [ 1, 2, 3 ]
b = tf.data.Dataset.range(4, 8)  # ==> [ 4, 5, 6, 7 ]
ds = a.concatenate(b)
list(ds.as_numpy_iterator())
[1, 2, 3, 4, 5, 6, 7]
# The input dataset and dataset to be concatenated should have
# compatible element specs.
c = tf.data.Dataset.zip((a, b))
a.concatenate(c)
Traceback (most recent call last):
TypeError: Two datasets to concatenate have different types
<dtype: 'int64'> and (tf.int64, tf.int64)
d = tf.data.Dataset.from_tensor_slices(["a", "b", "c"])
a.concatenate(d)
Traceback (most recent call last):
TypeError: Two datasets to concatenate have different types
<dtype: 'int64'> and <dtype: 'string'>
Аргументы
dataset Dataset для конкатенации.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

counter

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

@staticmethod
counter(
    start=0,
    step=1,
    dtype=tf.dtypes.int64,
    name=None
) -> 'DatasetV2'

Создает Dataset, который ведет счет от start с шагом размера step.

В отличие от tf.data.Dataset.range, который останавливается на определенном конечном числе, tf.data.Dataset.counter генерирует элементы бесконечно.

dataset = tf.data.experimental.Counter().take(5)
list(dataset.as_numpy_iterator())
[0, 1, 2, 3, 4]
dataset.element_spec
TensorSpec(shape=(), dtype=tf.int64, name=None)
dataset = tf.data.experimental.Counter(dtype=tf.int32)
dataset.element_spec
TensorSpec(shape=(), dtype=tf.int32, name=None)
dataset = tf.data.experimental.Counter(start=2).take(5)
list(dataset.as_numpy_iterator())
[2, 3, 4, 5, 6]
dataset = tf.data.experimental.Counter(start=2, step=5).take(5)
list(dataset.as_numpy_iterator())
[2, 7, 12, 17, 22]
dataset = tf.data.experimental.Counter(start=10, step=-1).take(5)
list(dataset.as_numpy_iterator())
[10, 9, 8, 7, 6]
Аргументы
start (Необязательно.) Начальное значение для счетчика. По умолчанию 0.
step (Необязательно.) Размер шага для счетчика. По умолчанию 1.
dtype (Необязательно.) Тип данных для элементов счетчика. По умолчанию tf.int64.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Dataset из скалярных элементов dtype.

enumerate

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

enumerate(
    start=0, name=None
) -> 'DatasetV2'

Нумерует элементы этого набора данных.

Аналогично функции enumerate в Python.

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.enumerate(start=5)
for element in dataset.as_numpy_iterator():
  print(element)
(5, 1)
(6, 2)
(7, 3)
# The (nested) structure of the input dataset determines the
# structure of elements in the resulting dataset.
dataset = tf.data.Dataset.from_tensor_slices([(7, 8), (9, 10)])
dataset = dataset.enumerate()
for element in dataset.as_numpy_iterator():
  print(element)
(0, array([7, 8], dtype=int32))
(1, array([ 9, 10], dtype=int32))
Аргументы
start Скалярный tf.Tensor типа tf.int64, представляющий начальное значение для нумерации.
name Необязательно. Имя для операций tf.data, используемых enumerate.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

filter

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

filter(
    predicate, name=None
) -> 'DatasetV2'

Фильтрует этот набор данных в соответствии с predicate.

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.filter(lambda x: x < 3)
list(dataset.as_numpy_iterator())
[1, 2]
# `tf.math.equal(x, y)` is required for equality comparison
def filter_fn(x):
  return tf.math.equal(x, 1)
dataset = dataset.filter(filter_fn)
list(dataset.as_numpy_iterator())
[1]
Аргументы
predicate Функция, сопоставляющая элемент набора данных с булевым значением.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

filter_with_legacy_function

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

filter_with_legacy_function(
    predicate
) -> 'DatasetV2'

Фильтрует этот набор данных в соответствии с predicate. (устарело)

Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте `tf.data.Dataset.filter()
Примечание: Это резервный вариант для существующего использования filter, который не работает с функциями V2. Новое использование настоятельно не рекомендуется, а существующие случаи использования следует перевести на filter, так как этот метод будет удален в V2.
Аргументы
predicate Функция, сопоставляющая (вложенную) структуру тензоров (имеющих формы и типы, определенные self.output_shapes и self.output_types) со скалярным тензором tf.bool.
Возвращает
Dataset Объект Dataset, содержащий элементы этого набора данных, для которых predicate равен True.

fingerprint

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

fingerprint()

Вычисляет отпечаток (fingerprint) этого Dataset.

Если два набора данных имеют одинаковый отпечаток, гарантируется, что они будут производить идентичные элементы, пока содержимое вышестоящих входных файлов не изменяется и они производят данные детерминированно.

Однако создание одинаковых значений двумя наборами данных не всегда означает, что они будут иметь одинаковый отпечаток из-за различий в конструкциях графа.

Иными словами, если два набора данных имеют разные отпечатки, они все равно могут производить идентичные значения.

Возвращает
Скалярный tf.Tensor типа tf.uint64.

flat_map

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

flat_map(
    map_func, name=None
) -> 'DatasetV2'

Применяет отображение map_func к этому набору данных и выполняет сглаживание (flatten) результата.

Сигнатура типа:

def flat_map(
  self: Dataset[T],
  map_func: Callable[[T], Dataset[S]]
) -> Dataset[S]

Используйте flat_map, если хотите гарантировать сохранение исходного порядка элементов в наборе данных. Например, чтобы преобразовать набор данных из пакетов (batches) в плоский набор данных из их элементов:

dataset = tf.data.Dataset.from_tensor_slices(
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]])
dataset = dataset.flat_map(tf.data.Dataset.from_tensor_slices)
list(dataset.as_numpy_iterator())
[1, 2, 3, 4, 5, 6, 7, 8, 9]

tf.data.Dataset.interleave() является обобщением flat_map, поскольку flat_map производит тот же результат, что и tf.data.Dataset.interleave(cycle_length=1)

Аргументы
map_func Функция, отображающая элемент набора данных в набор данных.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый объект Dataset с примененным преобразованием, описанным выше.

from_generator

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

@staticmethod
from_generator(
    generator,
    output_types=None,
    output_shapes=None,
    args=None,
    output_signature=None,
    name=None
) -> 'DatasetV2'

Создает Dataset, элементы которого генерируются с помощью generator. (устаревшие аргументы)

Устарело: НЕКОТОРЫЕ АРГУМЕНТЫ УСТАРЕЛИ: (output_shapes, output_types). Они будут удалены в будущей версии. Инструкции по обновлению: используйте output_signature взамен
Примечание: Текущая реализация Dataset.from_generator() использует tf.numpy_function и наследует те же ограничения. В частности, она требует, чтобы операции, связанные с набором данных и итератором, размещались на устройстве в том же процессе, что и программа на Python, вызвавшая Dataset.from_generator(). В частности, использование from_generator сделает невозможным использование сервиса tf.data для масштабирования обработки набора данных. Тело generator не будет сериализовано в GraphDef, и вам не следует использовать этот метод, если требуется сериализовать вашу модель и восстановить ее в другом окружении.

Аргумент generator должен быть вызываемым объектом, который возвращает объект, поддерживающий протокол iter() (например, функцию-генератор).

Элементы, генерируемые generator, должны быть совместимы либо с заданным аргументом output_signature, либо с заданными аргументами output_types и (необязательно) output_shapes, в зависимости от того, что было указано.

Рекомендуемый способ вызова from_generator — использовать аргумент output_signature. В этом случае предполагается, что выходные данные состоят из объектов с классами, формами (shapes) и типами, определенными объектами tf.TypeSpec из аргумента output_signature:

def gen():
  ragged_tensor = tf.ragged.constant([[1, 2], [3]])
  yield 42, ragged_tensor

dataset = tf.data.Dataset.from_generator(
     gen,
     output_signature=(
         tf.TensorSpec(shape=(), dtype=tf.int32),
         tf.RaggedTensorSpec(shape=(2, None), dtype=tf.int32)))

list(dataset.take(1))
[(<tf.Tensor: shape=(), dtype=int32, numpy=42>,
<tf.RaggedTensor [[1, 2], [3]]>)]

Существует также устаревший способ вызова from_generator только с аргументом output_types или совместно с аргументом output_shapes. В этом случае предполагается, что результат функции состоит из объектов tf.Tensor с типами, определенными в output_types, и с формами, которые либо неизвестны, либо определены в output_shapes.

Примечание: Если generator зависит от изменяемых глобальных переменных или другого внешнего состояния, имейте в виду, что среда выполнения может вызывать generator многократно (для поддержки повторения Dataset) и в любой момент времени между вызовом Dataset.from_generator() и генерацией первого элемента генератором. Изменение глобальных переменных или внешнего состояния может привести к неопределенному поведению, поэтому мы рекомендуем явно кэшировать любое внешнее состояние в generator перед вызовом Dataset.from_generator().
Примечание: Хотя параметр output_signature позволяет генерировать элементы Dataset, область применения Dataset.from_generator() должна быть ограничена логикой, которую невозможно выразить с помощью операций tf.data. Использование операций tf.data внутри функции-генератора является антипаттерном и может привести к постепенному росту потребления памяти.
Аргументы
generator Вызываемый объект, возвращающий объект, поддерживающий протокол iter(). Если аргумент args не указан, generator не должен принимать аргументов; в противном случае он должен принимать столько аргументов, сколько значений содержится в args.
output_types (Необязательно.) (Вложенная) структура объектов tf.DType, соответствующая каждому компоненту элемента, генерируемого generator.
output_shapes (Необязательно.) (Вложенная) структура объектов tf.TensorShape, соответствующая каждому компоненту элемента, генерируемого generator.
args (Необязательно.) Кортеж объектов tf.Tensor, которые будут вычислены и переданы в generator в качестве аргументов массивов NumPy.
output_signature (Необязательно.) (Вложенная) структура объектов tf.TypeSpec, соответствующая каждому компоненту элемента, генерируемого generator.
name (Необязательно.) Имя для операций tf.data, используемых from_generator.
Возвращает
Dataset Объект Dataset.

from_sparse_tensor_slices

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

@staticmethod
from_sparse_tensor_slices(
    sparse_tensor
)

Разделяет каждый tf.sparse.SparseTensor ранга N в этом наборе данных построчно. (устарело)

Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте tf.data.Dataset.from_tensor_slices().
Аргументы
sparse_tensor Объект tf.sparse.SparseTensor.
Возвращает
Dataset Объект Dataset из разреженных тензоров ранга (N-1).

from_tensor_slices

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

@staticmethod
from_tensor_slices(
    tensors, name=None
) -> 'DatasetV2'

Создает Dataset, элементы которого являются срезами заданных тензоров.

Заданные тензоры нарезаются вдоль их первого измерения. Эта операция сохраняет структуру входных тензоров, удаляя первое измерение каждого тензора и используя его как измерение набора данных. Все входные тензоры должны иметь одинаковый размер по первому измерению.

# Slicing a 1D tensor produces scalar tensor elements.
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
list(dataset.as_numpy_iterator())
[1, 2, 3]
# Slicing a 2D tensor produces 1D tensor elements.
dataset = tf.data.Dataset.from_tensor_slices([[1, 2], [3, 4]])
list(dataset.as_numpy_iterator())
[array([1, 2], dtype=int32), array([3, 4], dtype=int32)]
# Slicing a tuple of 1D tensors produces tuple elements containing
# scalar tensors.
dataset = tf.data.Dataset.from_tensor_slices(([1, 2], [3, 4], [5, 6]))
list(dataset.as_numpy_iterator())
[(1, 3, 5), (2, 4, 6)]
# Dictionary structure is also preserved.
dataset = tf.data.Dataset.from_tensor_slices({"a": [1, 2], "b": [3, 4]})
list(dataset.as_numpy_iterator()) == [{'a': 1, 'b': 3},
                                      {'a': 2, 'b': 4}]
True
# Two tensors can be combined into one Dataset object.
features = tf.constant([[1, 3], [2, 1], [3, 3]]) # ==> 3x2 tensor
labels = tf.constant(['A', 'B', 'A']) # ==> 3x1 tensor
dataset = Dataset.from_tensor_slices((features, labels))
# Both the features and the labels tensors can be converted
# to a Dataset object separately and combined after.
features_dataset = Dataset.from_tensor_slices(features)
labels_dataset = Dataset.from_tensor_slices(labels)
dataset = Dataset.zip((features_dataset, labels_dataset))
# A batched feature and label set can be converted to a Dataset
# in similar fashion.
batched_features = tf.constant([[[1, 3], [2, 3]],
                                [[2, 1], [1, 2]],
                                [[3, 3], [3, 2]]], shape=(3, 2, 2))
batched_labels = tf.constant([['A', 'A'],
                              ['B', 'B'],
                              ['A', 'B']], shape=(3, 2, 1))
dataset = Dataset.from_tensor_slices((batched_features, batched_labels))
for element in dataset.as_numpy_iterator():
  print(element)
(array([[1, 3],
       [2, 3]], dtype=int32), array([[b'A'],
       [b'A']], dtype=object))
(array([[2, 1],
       [1, 2]], dtype=int32), array([[b'B'],
       [b'B']], dtype=object))
(array([[3, 3],
       [3, 2]], dtype=int32), array([[b'A'],
       [b'B']], dtype=object))

Обратите внимание: если tensors содержит массив NumPy и энергичное выполнение (eager execution) отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к нерациональному расходу памяти и превышению лимита размера сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативу, описанную в этом руководстве.

Аргументы
tensors Элемент набора данных, компоненты которого имеют одинаковый размер первого измерения. Поддерживаемые значения описаны здесь.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Dataset Объект Dataset.

from_tensors

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

@staticmethod
from_tensors(
    tensors, name=None
) -> 'DatasetV2'

Создает Dataset с единственным элементом, состоящим из заданных тензоров.

from_tensors создает набор данных, содержащий только один элемент. Чтобы разбить входной тензор на несколько элементов, используйте вместо этого from_tensor_slices.

dataset = tf.data.Dataset.from_tensors([1, 2, 3])
list(dataset.as_numpy_iterator())
[array([1, 2, 3], dtype=int32)]
dataset = tf.data.Dataset.from_tensors(([1, 2, 3], 'A'))
list(dataset.as_numpy_iterator())
[(array([1, 2, 3], dtype=int32), b'A')]
# You can use `from_tensors` to produce a dataset which repeats
# the same example many times.
example = tf.constant([1,2,3])
dataset = tf.data.Dataset.from_tensors(example).repeat(2)
list(dataset.as_numpy_iterator())
[array([1, 2, 3], dtype=int32), array([1, 2, 3], dtype=int32)]

Обратите внимание: если tensors содержит массив NumPy и энергичное выполнение (eager execution) отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к нерациональному расходу памяти и превышению лимита размера сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативу, описанную в этом руководстве.

Аргументы
tensors «Элемент» набора данных. Поддерживаемые значения описаны здесь.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Dataset Объект Dataset.

get_single_element

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

get_single_element(
    name=None
)

Возвращает единственный элемент dataset.

Функция позволяет использовать tf.data.Dataset в выражении без сохранения состояния вида «тензор на входе — тензор на выходе» без создания итератора. Это упрощает преобразование данных в тензорах за счет использования оптимизированной абстракции tf.data.Dataset поверх них.

Например, рассмотрим preprocessing_fn, которая принимает на вход необработанные признаки и возвращает обработанный признак вместе с его меткой.

def preprocessing_fn(raw_feature):
  # ... the raw_feature is preprocessed as per the use-case
  return feature

raw_features = ...  # input batch of BATCH_SIZE elements.
dataset = (tf.data.Dataset.from_tensor_slices(raw_features)
          .map(preprocessing_fn, num_parallel_calls=BATCH_SIZE)
          .batch(BATCH_SIZE))

processed_features = dataset.get_single_element()

В приведенном выше примере тензор raw_features длины length=BATCH_SIZE был преобразован в tf.data.Dataset. Затем каждый из raw_feature был отображен с помощью preprocessing_fn, а обработанные признаки были сгруппированы в один пакет (batch). Результирующий dataset содержит только один элемент, представляющий собой пакет всех обработанных признаков.

Примечание: dataset должен содержать только один элемент.

Теперь вместо создания итератора для dataset и извлечения пакета признаков используется функция tf.data.get_single_element(), позволяющая пропустить этап создания итератора и напрямую получить пакет признаков.

Это может быть особенно полезно, когда ваши тензорные преобразования выражены в виде операций tf.data.Dataset и вы хотите использовать эти преобразования при развертывании (serving) вашей модели.

Keras

model = ... # A pre-built or custom model

class PreprocessingModel(tf.keras.Model):
  def __init__(self, model):
    super().__init__(self)
    self.model = model

  @tf.function(input_signature=[...])
  def serving_fn(self, data):
    ds = tf.data.Dataset.from_tensor_slices(data)
    ds = ds.map(preprocessing_fn, num_parallel_calls=BATCH_SIZE)
    ds = ds.batch(batch_size=BATCH_SIZE)
    return tf.argmax(self.model(ds.get_single_element()), axis=-1)

preprocessing_model = PreprocessingModel(model)
your_exported_model_dir = ... # save the model to this path.
tf.saved_model.save(preprocessing_model, your_exported_model_dir,
              signatures={'serving_default': preprocessing_model.serving_fn}
              )
Аргументы
name (Необязательно.) Имя для операции tf.data.
Возвращает
Вложенная структура объектов tf.Tensor, соответствующая единственному элементу dataset.
Исключения
InvalidArgumentError (во время выполнения), если dataset содержит не ровно один элемент.

group_by_window

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

group_by_window(
    key_func, reduce_func, window_size=None, window_size_func=None, name=None
) -> 'DatasetV2'

Группирует окна элементов по ключу и выполняет их редукцию (свертку).

Это преобразование сопоставляет каждый последовательный элемент в наборе данных с ключом с помощью key_func и группирует элементы по ключу. Затем оно применяет reduce_func максимум к window_size_func(key) элементам с одинаковым ключом. Все окна для каждого ключа, кроме последнего, будут содержать window_size_func(key) элементов; последнее окно может быть меньше.

Вы можете указать либо константное значение window_size, либо размер окна, определяемый ключом с помощью window_size_func.

dataset = tf.data.Dataset.range(10)
window_size = 5
key_func = lambda x: x%2
reduce_func = lambda key, dataset: dataset.batch(window_size)
dataset = dataset.group_by_window(
          key_func=key_func,
          reduce_func=reduce_func,
          window_size=window_size)
for elem in dataset.as_numpy_iterator():
  print(elem)
[0 2 4 6 8]
[1 3 5 7 9]
Аргументы
key_func Функция, отображающая вложенную структуру тензоров (имеющих формы и типы, определенные в self.output_shapes и self.output_types) в скалярный тензор tf.int64.
reduce_func Функция, отображающая ключ и набор данных, содержащий до window_size последовательных элементов, соответствующих этому ключу, в другой набор данных.
window_size Скалярный tf.Tensor типа tf.int64, представляющий количество объединяемых в один пакет последовательных элементов, соответствующих одному и тому же ключу, который будет передан в reduce_func. Взаимно исключает window_size_func.
window_size_func Функция, сопоставляющая ключ со скалярным tf.Tensor типа tf.int64, представляющим количество объединяемых в один пакет последовательных элементов с одинаковым ключом, который будет передан в reduce_func. Взаимно исключает window_size.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый объект Dataset с примененным преобразованием, описанным выше.
Исключения
ValueError если не передан ни один или переданы оба параметра из {window_size, window_size_func}.

ignore_errors

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

ignore_errors(
    log_warning=False, name=None
) -> 'DatasetV2'

Отбрасывает элементы, вызывающие ошибки.

dataset = tf.data.Dataset.from_tensor_slices([1., 2., 0., 4.])
dataset = dataset.map(lambda x: tf.debugging.check_numerics(1. / x, ""))
list(dataset.as_numpy_iterator())
Traceback (most recent call last):

InvalidArgumentError: ... Tensor had Inf values
dataset = dataset.ignore_errors()
list(dataset.as_numpy_iterator())
[1.0, 0.5, 0.25]
Аргументы
log_warning (Необязательно.) Логическое значение (bool), указывающее, следует ли записывать игнорируемые ошибки в stderr. По умолчанию: False.
name (Необязательно.) Строка, указывающая имя для операции tf.data.
Возвращает
Новый объект Dataset с примененным преобразованием, описанным выше.

interleave

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

interleave(
    map_func,
    cycle_length=None,
    block_length=None,
    num_parallel_calls=None,
    deterministic=None,
    name=None
) -> 'DatasetV2'

Применяет map_func к этому набору данных и чередует результаты.

Сигнатура типов:

def interleave(
  self: Dataset[T],
  map_func: Callable[[T], Dataset[S]]
) -> Dataset[S]

Например, можно использовать Dataset.interleave() для параллельной обработки множества входных файлов:

# Preprocess 4 files concurrently, and interleave blocks of 16 records
# from each file.
filenames = ["/var/data/file1.txt", "/var/data/file2.txt",
             "/var/data/file3.txt", "/var/data/file4.txt"]
dataset = tf.data.Dataset.from_tensor_slices(filenames)
def parse_fn(filename):
  return tf.data.Dataset.range(10)
dataset = dataset.interleave(lambda x:
    tf.data.TextLineDataset(x).map(parse_fn, num_parallel_calls=1),
    cycle_length=4, block_length=16)

Аргументы cycle_length и block_length определяют порядок создания элементов. cycle_length управляет количеством одновременно обрабатываемых входных элементов. Если установить для cycle_length значение 1, это преобразование будет обрабатывать по одному входному элементу за раз и приведет к тем же результатам, что и tf.data.Dataset.flat_map. В целом, данное преобразование применит map_func к cycle_length входным элементам, откроет итераторы для возвращенных объектов Dataset и будет циклически перебирать их, извлекая по block_length последовательных элементов из каждого итератора и считывая следующий входной элемент каждый раз, когда достигается конец какого-либо итератора.

Например:

dataset = Dataset.range(1, 6)  # ==> [ 1, 2, 3, 4, 5 ]
# NOTE: New lines indicate "block" boundaries.
dataset = dataset.interleave(
    lambda x: Dataset.from_tensors(x).repeat(6),
    cycle_length=2, block_length=4)
list(dataset.as_numpy_iterator())
[1, 1, 1, 1,
 2, 2, 2, 2,
 1, 1,
 2, 2,
 3, 3, 3, 3,
 4, 4, 4, 4,
 3, 3,
 4, 4,
 5, 5, 5, 5,
 5, 5]
Примечание: Порядок элементов, выдаваемых этим преобразованием, является детерминированным при условии, что map_func — чистая функция и deterministic=True. Если map_func содержит какие-либо операции с сохранением состояния (stateful), порядок доступа к этому состоянию не определен.

Производительность часто можно повысить, установив num_parallel_calls, чтобы interleave использовал несколько потоков для извлечения элементов. Если детерминизм не требуется, для повышения производительности также можно установить deterministic=False.

filenames = ["/var/data/file1.txt", "/var/data/file2.txt",
             "/var/data/file3.txt", "/var/data/file4.txt"]
dataset = tf.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.interleave(lambda x: tf.data.TFRecordDataset(x),
    cycle_length=4, num_parallel_calls=tf.data.AUTOTUNE,
    deterministic=False)
Аргументы
map_func Функция, которая принимает элемент набора данных и возвращает tf.data.Dataset.
cycle_length (Необязательно.) Количество входных элементов, обрабатываемых одновременно. Если не задано, среда выполнения tf.data определяет это значение на основе доступных ресурсов ЦП. Если для num_parallel_calls установлено значение tf.data.AUTOTUNE, аргумент cycle_length определяет максимальную степень параллелизма.
block_length (Необязательно.) Количество последовательных элементов, извлекаемых из каждого входного элемента перед переходом к другому входному элементу. Если не задано, по умолчанию равно 1.
num_parallel_calls (Необязательно.) Если параметр указан, реализация создает пул потоков, который используется для асинхронного и параллельного получения входных данных из циклических элементов. Поведение по умолчанию — синхронное получение входных данных без распараллеливания. Если используется значение tf.data.AUTOTUNE, количество параллельных вызовов устанавливается динамически в зависимости от доступных ресурсов ЦП.
deterministic (Необязательно.) Если задан параметр num_parallel_calls и указано это булево значение (True или False), оно управляет порядком, в котором преобразование выдает элементы. Если установлено значение False, преобразованию разрешено выдавать элементы не по порядку, жертвуя детерминизмом ради производительности. Если не указано, поведение контролируется параметром tf.data.Options.deterministic (по умолчанию True).
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый объект Dataset с примененным преобразованием, описанным выше.

list_files

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

@staticmethod
list_files(
    file_pattern, shuffle=None, seed=None, name=None
) -> 'DatasetV2'

Набор данных со всеми файлами, соответствующими одному или нескольким шаблонам glob.

Аргумент file_pattern должен содержать небольшое количество шаблонов glob. Если имена ваших файлов уже были сопоставлены с шаблоном, используйте вместо этого Dataset.from_tensor_slices(filenames), так как повторное выполнение сопоставления шаблона (glob) для каждого имени файла с помощью list_files может привести к снижению производительности при работе с удаленными системами хранения.

Примечание: Поведение этого метода по умолчанию — возвращать имена файлов в недетерминированном случайном порядке. Передайте seed или shuffle=False, чтобы получить результаты в детерминированном порядке.
Пример
Если бы в нашей файловой системе были следующие файлы:
  • /path/to/dir/a.txt
  • /path/to/dir/b.py
  • /path/to/dir/c.py

Если мы передадим «/path/to/dir/*.py» в качестве директории, набор данных выдаст:

  • /path/to/dir/b.py
  • /path/to/dir/c.py
Аргументы
file_pattern Строка, список строк или tf.Tensor строкового типа (скаляр или вектор), представляющие шаблон(ы) glob для имен файлов (т. е. подстановочные знаки командной оболочки), по которым будет выполняться сопоставление.
shuffle (Необязательно.) Если True, имена файлов будут перемешаны в случайном порядке. По умолчанию: True.
seed (Необязательно.) Скалярный tf.Tensor типа tf.int64, представляющий начальное число (seed) генератора случайных чисел, используемое для создания распределения. См. описание поведения в tf.random.set_seed.
name (Необязательно.) Имя для операций tf.data, используемых list_files.
Возвращает
Dataset Объект Dataset из строк, соответствующих именам файлов.

load

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

@staticmethod
load(
    path, element_spec=None, compression=None, reader_func=None
) -> 'DatasetV2'

Загружает ранее сохраненный набор данных.

Пример использования:

import tempfile
path = os.path.join(tempfile.gettempdir(), "saved_data")
# Save a dataset
dataset = tf.data.Dataset.range(2)
tf.data.Dataset.save(dataset, path)
new_dataset = tf.data.Dataset.load(path)
for elem in new_dataset:
  print(elem)
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)

Если использовался вариант шардирования сохраненного набора данных по умолчанию, порядок элементов сохраненного набора данных сохранится при его загрузке.

Аргумент reader_func можно использовать для указания пользовательского порядка загрузки элементов из отдельных шардов. Ожидается, что reader_func принимает один аргумент — набор данных из наборов данных, каждый из которых содержит элементы одного из шардов — и возвращает набор данных из элементов. Например, порядок шардов можно перемешать при загрузке следующим образом:

def custom_reader_func(datasets):
  datasets = datasets.shuffle(NUM_SHARDS)
  return datasets.interleave(lambda x: x, num_parallel_calls=AUTOTUNE)

dataset = tf.data.Dataset.load(
    path="/path/to/data", ..., reader_func=custom_reader_func)
Аргументы
path Обязательно. Путь, указывающий на ранее сохраненный набор данных.
element_spec Необязательно. Вложенная структура объектов tf.TypeSpec, соответствующая структуре элемента сохраненного набора данных и определяющая тип отдельных компонентов элемента. Если не указано, используется вложенная структура tf.TypeSpec, сохраненная вместе с набором данных. Обратите внимание, что этот аргумент является обязательным в режиме графа.
compression Необязательно. Алгоритм, используемый для распаковки данных при их чтении. Поддерживаемые варианты: GZIP и NONE. По умолчанию: NONE.
reader_func Необязательно. Функция для управления чтением данных из шардов. При наличии функция будет трассирована и выполнена как вычисление графа.
Возвращает
Экземпляр tf.data.Dataset.
Исключения
FileNotFoundError Если element_spec не указан и сохраненная вложенная структура tf.TypeSpec не может быть найдена вместе с сохраненным набором данных.
ValueError Если element_spec не указан и метод выполняется в режиме графа.

make_initializable_iterator

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

make_initializable_iterator(
    shared_name=None
) -> tf.compat.v1.data.Iterator

Создает итератор для элементов этого набора данных. (устарело)

Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: это устаревший API, который следует использовать только в режиме графа TF 1 и устаревшем режиме графа TF 2, доступном через tf.compat.v1. Во всех остальных ситуациях — а именно в eager-режиме и внутри tf.function — вы можете получать элементы набора данных с помощью for elem in dataset: ... или путем явного создания итератора через iterator = iter(dataset) и извлечения его элементов через values = next(iterator). Кроме того, этот API недоступен в TF 2. Во время перехода с TF 1 на TF 2 вы можете использовать tf.compat.v1.data.make_initializable_iterator(dataset) для создания итератора в стиле режима графа TF 1 для набора данных, созданного с помощью API TF 2. Обратите внимание, что это должно быть переходным состоянием вашей кодовой базы, так как в общем случае нет никаких гарантий совместимости кода TF 1 и TF 2.
Примечание: Возвращенный итератор будет находиться в неинициализированном состоянии, и перед его использованием необходимо выполнить операцию iterator.initializer:
# Building graph ...
dataset = ...
iterator = dataset.make_initializable_iterator()
next_value = iterator.get_next()  # This is a Tensor.

# ... from within a session ...
sess.run(iterator.initializer)
try:
  while True:
    value = sess.run(next_value)
    ...
except tf.errors.OutOfRangeError:
    pass
Аргументы
shared_name (Необязательно.) Если параметр не пустой, возвращаемый итератор будет доступен под заданным именем для нескольких сессий, совместно использующих одни и те же устройства (например, при использовании удаленного сервера).
Возвращает
Объект tf.data.Iterator для элементов этого набора данных.
Исключения
RuntimeError Если включено eager-выполнение.

make_one_shot_iterator

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

make_one_shot_iterator() -> Union[iterator_ops.Iterator, iterator_ops.OwnedIterator]

Создает итератор для элементов этого набора данных. (устарело)

Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: это устаревший API, который следует использовать только в графовом режиме TF 1 и устаревшем графовом режиме TF 2, доступном через tf.compat.v1. Во всех остальных ситуациях — а именно в режиме eager и внутри tf.function — вы можете получать элементы набора данных с помощью for elem in dataset: ... или путем явного создания итератора через iterator = iter(dataset) и извлечения его элементов через values = next(iterator). Кроме того, этот API недоступен в TF 2. Во время перехода с TF 1 на TF 2 вы можете использовать tf.compat.v1.data.make_one_shot_iterator(dataset) для создания итератора в стиле графового режима TF 1 для набора данных, созданного с помощью API TF 2. Обратите внимание, что это должно быть временным состоянием вашей кодовой базы, так как в целом нет никаких гарантий взаимодействия кода TF 1 и TF 2.
Примечание: Возвращаемый итератор будет инициализирован автоматически. «One-shot» итератор в настоящее время не поддерживает повторную инициализацию. Для этого см. make_initializable_iterator.

Пример:

# Building graph ...
dataset = ...
next_value = dataset.make_one_shot_iterator().get_next()

# ... from within a session ...
try:
  while True:
    value = sess.run(next_value)
    ...
except tf.errors.OutOfRangeError:
    pass
Возвращает
Объект tf.data.Iterator для элементов этого набора данных.

map

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

map(
    map_func, num_parallel_calls=None, deterministic=None, name=None
)

Применяет map_func к элементам этого набора данных.

Это преобразование применяет map_func к каждому элементу этого набора данных и возвращает новый набор данных, содержащий преобразованные элементы в том же порядке, в котором они находились во входных данных. map_func можно использовать для изменения как значений, так и структуры элементов набора данных. Поддерживаемые конструкты структур описаны здесь.

Например, map можно использовать для добавления 1 к каждому элементу или для проекции подмножества компонентов элемента.

dataset = Dataset.range(1, 6)  # ==> [ 1, 2, 3, 4, 5 ]
dataset = dataset.map(lambda x: x + 1)
list(dataset.as_numpy_iterator())
[2, 3, 4, 5, 6]

Входная сигнатура map_func определяется структурой каждого элемента в этом наборе данных.

dataset = Dataset.range(5)
# `map_func` takes a single argument of type `tf.Tensor` with the same
# shape and dtype.
result = dataset.map(lambda x: x + 1)
# Each element is a tuple containing two `tf.Tensor` objects.
elements = [(1, "foo"), (2, "bar"), (3, "baz")]
dataset = tf.data.Dataset.from_generator(
    lambda: elements, (tf.int32, tf.string))
# `map_func` takes two arguments of type `tf.Tensor`. This function
# projects out just the first component.
result = dataset.map(lambda x_int, y_str: x_int)
list(result.as_numpy_iterator())
[1, 2, 3]
# Each element is a dictionary mapping strings to `tf.Tensor` objects.
elements =  ([{"a": 1, "b": "foo"},
              {"a": 2, "b": "bar"},
              {"a": 3, "b": "baz"}])
dataset = tf.data.Dataset.from_generator(
    lambda: elements, {"a": tf.int32, "b": tf.string})
# `map_func` takes a single argument of type `dict` with the same keys
# as the elements.
result = dataset.map(lambda d: str(d["a"]) + d["b"])

Значение или значения, возвращаемые map_func, определяют структуру каждого элемента в возвращаемом наборе данных.

dataset = tf.data.Dataset.range(3)
# `map_func` returns two `tf.Tensor` objects.
def g(x):
  return tf.constant(37.0), tf.constant(["Foo", "Bar", "Baz"])
result = dataset.map(g)
result.element_spec
(TensorSpec(shape=(), dtype=tf.float32, name=None), TensorSpec(shape=(3,), dtype=tf.string, name=None))
# Python primitives, lists, and NumPy arrays are implicitly converted to
# `tf.Tensor`.
def h(x):
  return 37.0, ["Foo", "Bar"], np.array([1.0, 2.0], dtype=np.float64)
result = dataset.map(h)
result.element_spec
(TensorSpec(shape=(), dtype=tf.float32, name=None), TensorSpec(shape=(2,), dtype=tf.string, name=None), TensorSpec(shape=(2,), dtype=tf.float64, name=None))
# `map_func` can return nested structures.
def i(x):
  return (37.0, [42, 16]), "foo"
result = dataset.map(i)
result.element_spec
((TensorSpec(shape=(), dtype=tf.float32, name=None),
  TensorSpec(shape=(2,), dtype=tf.int32, name=None)),
 TensorSpec(shape=(), dtype=tf.string, name=None))

map_func может принимать в качестве аргументов и возвращать любой тип элемента набора данных.

Обратите внимание, что независимо от контекста, в котором определена map_func (eager или граф), tf.data трассирует функцию и выполняет ее в виде графа. Для использования Python-кода внутри функции у вас есть несколько вариантов:

1) Положиться на AutoGraph для преобразования кода Python в эквивалентные вычисления графа. Недостатком этого подхода является то, что AutoGraph может преобразовать некоторый, но не весь код Python.

2) Использовать tf.py_function, что позволяет писать произвольный код на Python, но, как правило, приводит к худшей производительности, чем 1). Например:

d = tf.data.Dataset.from_tensor_slices(['hello', 'world'])
# transform a string tensor to upper case string using a Python function
def upper_case_fn(t: tf.Tensor):
  return t.numpy().decode('utf-8').upper()
d = d.map(lambda x: tf.py_function(func=upper_case_fn,
          inp=[x], Tout=tf.string))
list(d.as_numpy_iterator())
[b'HELLO', b'WORLD']

3) Использовать tf.numpy_function, что также позволяет писать произвольный код на Python. Обратите внимание, что tf.py_function принимает tf.Tensor, тогда как tf.numpy_function принимает массивы NumPy и возвращает только массивы NumPy. Например:

d = tf.data.Dataset.from_tensor_slices(['hello', 'world'])
def upper_case_fn(t: np.ndarray):
  return t.decode('utf-8').upper()
d = d.map(lambda x: tf.numpy_function(func=upper_case_fn,
          inp=[x], Tout=tf.string))
list(d.as_numpy_iterator())
[b'HELLO', b'WORLD']

Обратите внимание, что использование tf.numpy_function и tf.py_function в целом исключает возможность параллельного выполнения пользовательских преобразований (из-за Python GIL).

Производительность часто можно повысить, установив num_parallel_calls, чтобы map использовала несколько потоков для обработки элементов. Если детерминированный порядок не требуется, повышение производительности также может быть достигнуто установкой deterministic=False.

dataset = Dataset.range(1, 6)  # ==> [ 1, 2, 3, 4, 5 ]
dataset = dataset.map(lambda x: x + 1,
    num_parallel_calls=tf.data.AUTOTUNE,
    deterministic=False)

Порядок элементов, выдаваемых этим преобразованием, является детерминированным, если deterministic=True. Если map_func содержит операции с сохранением состояния (stateful operations) и num_parallel_calls > 1, порядок доступа к этому состоянию не определен, поэтому значения выходных элементов могут не быть детерминированными независимо от значения флага deterministic.

Аргументы
map_func Функция, отображающая элемент набора данных в другой элемент набора данных.
num_parallel_calls (Необязательно.) Скалярный tf.Tensor типа tf.int64, представляющий количество элементов для асинхронной параллельной обработки. Если не указан, элементы будут обрабатываться последовательно. Если используется значение tf.data.AUTOTUNE, то количество параллельных вызовов устанавливается динамически в зависимости от доступных ресурсов процессора.
deterministic (Необязательно.) Если указан параметр num_parallel_calls, и задано это логическое значение (True или False), оно управляет порядком, в котором преобразование выдает элементы. Если установлено значение False, преобразованию разрешено выдавать элементы не по порядку, жертвуя детерминизмом ради производительности. Если не указано, поведение определяется параметром tf.data.Options.deterministic (по умолчанию True).
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

map_with_legacy_function

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

map_with_legacy_function(
    map_func, num_parallel_calls=None, deterministic=None
) -> 'DatasetV1Adapter'

Применяет map_func к элементам этого набора данных. (устарело)

Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: используйте `tf.data.Dataset.map()
Примечание: Это обходной путь для существующих вариантов использования map, которые не работают с функциями V2. Использование метода в новом коде настоятельно не рекомендуется, а существующий код следует перевести на map, так как этот метод будет удален в V2.
Аргументы
map_func Функция, отображающая (вложенную) структуру тензоров (с формами и типами, определенными self.output_shapes и self.output_types) в другую (вложенную) структуру тензоров.
num_parallel_calls (Необязательно.) Скалярный tf.Tensor типа tf.int32, представляющий количество элементов для асинхронной параллельной обработки. Если не указан, элементы будут обрабатываться последовательно. Если используется значение tf.data.AUTOTUNE, то количество параллельных вызовов устанавливается динамически в зависимости от доступных ресурсов процессора.
deterministic (Необязательно.) Если указан параметр num_parallel_calls, это логическое значение управляет порядком, в котором преобразование выдает элементы. Если установлено значение False, преобразованию разрешено выдавать элементы не по порядку, жертвуя детерминизмом ради производительности. Если не указано, поведение определяется параметром tf.data.Options.deterministic (по умолчанию True).
Возвращает
Dataset Объект Dataset.

options

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

options()

Возвращает параметры (options) для этого набора данных и его входных данных.

Возвращает
Объект tf.data.Options, представляющий параметры набора данных.

padded_batch

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

padded_batch(
    batch_size,
    padded_shapes=None,
    padding_values=None,
    drop_remainder=False,
    name=None
) -> 'DatasetV2'

Объединяет последовательные элементы этого набора данных в дополненные батчи (padded batches).

Это преобразование объединяет несколько последовательных элементов входного набора данных в один элемент.

Как и в случае с tf.data.Dataset.batch, компоненты результирующего элемента будут иметь дополнительное внешнее измерение, которое будет равно batch_size (или N % batch_size для последнего элемента, если batch_size не делит количество входных элементов N нацело и drop_remainder равно False). Если работа вашей программы зависит от того, имеют ли батчи одинаковое внешнее измерение, следует установить аргумент drop_remainder в True, чтобы предотвратить создание батча меньшего размера.

В отличие от tf.data.Dataset.batch, объединяемые в батчи входные элементы могут иметь разные формы, и это преобразование дополнит каждый компонент до соответствующей формы в padded_shapes. Аргумент padded_shapes определяет результирующую форму для каждого измерения каждого компонента в выходном элементе:

  • Если измерение является константой, компонент будет дополнен до этой длины по данному измерению.
  • Если измерение неизвестно, компонент будет дополнен до максимальной длины всех элементов по данному измерению.
A = (tf.data.Dataset
     .range(1, 5, output_type=tf.int32)
     .map(lambda x: tf.fill([x], x)))
# Pad to the smallest per-batch size that fits all elements.
B = A.padded_batch(2)
for element in B.as_numpy_iterator():
  print(element)
[[1 0]
 [2 2]]
[[3 3 3 0]
 [4 4 4 4]]
# Pad to a fixed size.
C = A.padded_batch(2, padded_shapes=5)
for element in C.as_numpy_iterator():
  print(element)
[[1 0 0 0 0]
 [2 2 0 0 0]]
[[3 3 3 0 0]
 [4 4 4 4 0]]
# Pad with a custom value.
D = A.padded_batch(2, padded_shapes=5, padding_values=-1)
for element in D.as_numpy_iterator():
  print(element)
[[ 1 -1 -1 -1 -1]
 [ 2  2 -1 -1 -1]]
[[ 3  3  3 -1 -1]
 [ 4  4  4  4 -1]]
# Components of nested elements can be padded independently.
elements = [([1, 2, 3], [10]),
            ([4, 5], [11, 12])]
dataset = tf.data.Dataset.from_generator(
    lambda: iter(elements), (tf.int32, tf.int32))
# Pad the first component of the tuple to length 4, and the second
# component to the smallest size that fits.
dataset = dataset.padded_batch(2,
    padded_shapes=([4], [None]),
    padding_values=(-1, 100))
list(dataset.as_numpy_iterator())
[(array([[ 1,  2,  3, -1], [ 4,  5, -1, -1]], dtype=int32),
  array([[ 10, 100], [ 11,  12]], dtype=int32))]
# Pad with a single value and multiple components.
E = tf.data.Dataset.zip((A, A)).padded_batch(2, padding_values=-1)
for element in E.as_numpy_iterator():
  print(element)
(array([[ 1, -1],
       [ 2,  2]], dtype=int32), array([[ 1, -1],
       [ 2,  2]], dtype=int32))
(array([[ 3,  3,  3, -1],
       [ 4,  4,  4,  4]], dtype=int32), array([[ 3,  3,  3, -1],
       [ 4,  4,  4,  4]], dtype=int32))

См. также tf.data.experimental.dense_to_sparse_batch, который объединяет элементы, могущие иметь различные формы, в tf.sparse.SparseTensor.

Аргументы
batch_size Скалярный tf.Tensor типа tf.int64, представляющий количество последовательных элементов этого набора данных для объединения в один батч.
padded_shapes (Необязательно.) (Вложенная) структура объектов tf.TensorShape или векторных тензороподобных объектов типа tf.int64, представляющая форму, до которой соответствующий компонент каждого входного элемента должен быть дополнен перед формированием батча. Любые неизвестные измерения будут дополнены до максимального размера этого измерения в каждом батче. Если не задано, все измерения всех компонентов дополняются до максимального размера в батче. Параметр padded_shapes должен быть задан, если какой-либо компонент имеет неизвестный ранг.
padding_values (Необязательно.) (Вложенная) структура скалярных тензоров tf.Tensor, представляющая значения дополнения, используемые для соответствующих компонентов. None означает, что (вложенная) структура должна дополняться значениями по умолчанию. Значениями по умолчанию являются 0 для числовых типов и пустая строка для строковых типов. Параметр padding_values должен иметь ту же (вложенную) структуру, что и входной набор данных. Если padding_values является отдельным элементом, а входной набор данных содержит несколько компонентов, то одно и то же значение padding_values будет использоваться для дополнения каждого компонента набора данных. Если padding_values является скаляром, его значение будет транслировано в соответствии с формой каждого компонента.
drop_remainder (Необязательно.) Скалярный tf.Tensor типа tf.bool, определяющий, следует ли отбрасывать последний батч, если в нем меньше элементов, чем batch_size; поведение по умолчанию — не отбрасывать батч меньшего размера.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.
Исключения
ValueError Если компонент имеет неизвестный ранг, а аргумент padded_shapes не задан.
TypeError Если компонент имеет неподдерживаемый тип. Список поддерживаемых типов приведен в https://www.tensorflow.org/guide/data#dataset_structure

prefetch

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

prefetch(
    buffer_size, name=None
) -> 'DatasetV2'

Создает Dataset, который выполняет предварительную выборку (prefetch) элементов из этого набора данных.

Большинство конвейеров ввода наборов данных должны заканчиваться вызовом prefetch. Это позволяет подготавливать последующие элементы во время обработки текущего элемента. Это часто снижает задержку и увеличивает пропускную способность за счет использования дополнительной памяти для хранения предварительно загруженных элементов.

Примечание: Как и другие методы Dataset, prefetch работает с элементами входного набора данных. У него нет концепции разделения на примеры и батчи. examples.prefetch(2) выполнит предварительную выборку двух элементов (2 примера), тогда как examples.batch(20).prefetch(2) предварительно загрузит 2 элемента (2 батча по 20 примеров в каждом).
dataset = tf.data.Dataset.range(3)
dataset = dataset.prefetch(2)
list(dataset.as_numpy_iterator())
[0, 1, 2]
Аргументы
buffer_size Скалярный tf.Tensor типа tf.int64, представляющий максимальное количество элементов, которые будут буферизованы при предварительной выборке. Если используется значение tf.data.AUTOTUNE, то размер буфера настраивается динамически.
name Необязательно. Имя для преобразования tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

ragged_batch

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

ragged_batch(
    batch_size,
    drop_remainder=False,
    row_splits_dtype=tf.dtypes.int64,
    name=None
) -> 'DatasetV2'

Объединяет последовательные элементы этого набора данных в tf.RaggedTensor.

Как и в tf.data.Dataset.batch, компоненты результирующего элемента будут иметь дополнительное внешнее измерение, которое будет равно batch_size (или N % batch_size для последнего элемента, если batch_size не делит количество входных элементов N нацело и drop_remainder равно False). Если работа вашей программы зависит от того, имеют ли батчи одинаковое внешнее измерение, следует установить аргумент drop_remainder в True, чтобы предотвратить создание батча меньшего размера.

В отличие от tf.data.Dataset.batch, входные элементы, объединяемые в батчи, могут иметь разные формы:

  • Если входной элемент представляет собой tf.Tensor, статическая форма tf.TensorShape которого полностью определена, он объединяется в батч как обычно.
  • Если входной элемент представляет собой tf.Tensor, статическая форма tf.TensorShape которого содержит одну или несколько осей неизвестного размера (т. е. shape[i]=None), вывод будет содержать tf.RaggedTensor, который является неоднородным (ragged) по любому из таких измерений.
  • Если входной элемент представляет собой tf.RaggedTensor или любой другой тип, он объединяется в батч как обычно.

Пример:

dataset = tf.data.Dataset.range(6)
dataset = dataset.map(lambda x: tf.range(x))
dataset.element_spec.shape
TensorShape([None])
dataset = dataset.ragged_batch(2)
for batch in dataset:
  print(batch)
<tf.RaggedTensor [[], [0]]>
<tf.RaggedTensor [[0, 1], [0, 1, 2]]>
<tf.RaggedTensor [[0, 1, 2, 3], [0, 1, 2, 3, 4]]>
Аргументы
batch_size Скалярный tf.Tensor типа tf.int64, представляющий количество последовательных элементов этого набора данных для объединения в один батч.
drop_remainder (Необязательно.) Скалярный tf.Tensor типа tf.bool, указывающий, следует ли отбрасывать последний батч, если в нем меньше элементов, чем batch_size; поведение по умолчанию — не отбрасывать меньший батч.
row_splits_dtype Тип данных (dtype), который должен использоваться для row_splits любых новых ragged-тензоров. У существующих элементов tf.RaggedTensor dtype у row_splits не изменяется.
name (Необязательно.) Строка, задающая имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

random

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

@staticmethod
random(
    seed=None, rerandomize_each_iteration=None, name=None
) -> 'DatasetV2'

Создает Dataset псевдослучайных значений.

Набор данных генерирует последовательность равномерно распределенных целочисленных значений.

rerandomize_each_iteration определяет, должна ли генерируемая последовательность случайных чисел заново рандомизироваться для каждой эпохи. Значение по умолчанию — False, при котором набор данных генерирует одну и ту же последовательность случайных чисел для каждой эпохи.

ds1 = tf.data.Dataset.random(seed=4).take(10)
ds2 = tf.data.Dataset.random(seed=4).take(10)
print(list(ds1.as_numpy_iterator())==list(ds2.as_numpy_iterator()))
True
ds3 = tf.data.Dataset.random(seed=4).take(10)
ds3_first_epoch = list(ds3.as_numpy_iterator())
ds3_second_epoch = list(ds3.as_numpy_iterator())
print(ds3_first_epoch == ds3_second_epoch)
True
ds4 = tf.data.Dataset.random(
    seed=4, rerandomize_each_iteration=True).take(10)
ds4_first_epoch = list(ds4.as_numpy_iterator())
ds4_second_epoch = list(ds4.as_numpy_iterator())
print(ds4_first_epoch == ds4_second_epoch)
False
Аргументы
seed (Необязательно.) Если параметр указан, набор данных генерирует детерминированную последовательность значений.
rerandomize_each_iteration (Необязательно.) Если установлено значение False, набор данных генерирует одну и ту же последовательность случайных чисел для каждой эпохи. Если установлено значение True, он генерирует другую детерминированную последовательность случайных чисел для каждой эпохи. По умолчанию установлено значение False, если не указано иное.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Dataset Объект Dataset.

range

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

@staticmethod
range(
    *args, **kwargs
) -> 'DatasetV2'

Создает Dataset диапазона значений, разделенных шагом.

list(Dataset.range(5).as_numpy_iterator())
[0, 1, 2, 3, 4]
list(Dataset.range(2, 5).as_numpy_iterator())
[2, 3, 4]
list(Dataset.range(1, 5, 2).as_numpy_iterator())
[1, 3]
list(Dataset.range(1, 5, -2).as_numpy_iterator())
[]
list(Dataset.range(5, 1).as_numpy_iterator())
[]
list(Dataset.range(5, 1, -2).as_numpy_iterator())
[5, 3]
list(Dataset.range(2, 5, output_type=tf.int32).as_numpy_iterator())
[2, 3, 4]
list(Dataset.range(1, 5, 2, output_type=tf.float32).as_numpy_iterator())
[1.0, 3.0]
Аргументы
*args следует той же семантике, что и range в Python. len(args) == 1 -> start = 0, stop = args[0], step = 1. len(args) == 2 -> start = args[0], stop = args[1], step = 1. len(args) == 3 -> start = args[0], stop = args[1], step = args[2].
**kwargs
  • output_type: ожидаемый dtype. (Необязательно, по умолчанию: tf.int64).
  • name: (Необязательно.) Имя для операции tf.data.
Возвращает
Dataset Объект RangeDataset.
Исключения
ValueError если len(args) == 0.

rebatch

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

rebatch(
    batch_size, drop_remainder=False, name=None
) -> 'DatasetV2'

Создает Dataset, который повторно формирует батчи из элементов этого набора данных.

rebatch(N) функционально эквивалентен unbatch().batch(N), но более эффективен, выполняя одно копирование вместо двух.

ds = tf.data.Dataset.range(6)
ds = ds.batch(2)
ds = ds.rebatch(3)
list(ds.as_numpy_iterator())
[array([0, 1, 2]), array([3, 4, 5])]
ds = tf.data.Dataset.range(7)
ds = ds.batch(4)
ds = ds.rebatch(3)
list(ds.as_numpy_iterator())
[array([0, 1, 2]), array([3, 4, 5]), array([6])]
ds = tf.data.Dataset.range(7)
ds = ds.batch(2)
ds = ds.rebatch(3, drop_remainder=True)
list(ds.as_numpy_iterator())
[array([0, 1, 2]), array([3, 4, 5])]

Если аргумент batch_size является списком, rebatch циклически перебирает элементы списка для определения размера каждого батча.

ds = tf.data.Dataset.range(8)
ds = ds.batch(4)
ds = ds.rebatch([2, 1, 1])
list(ds.as_numpy_iterator())
[array([0, 1]), array([2]), array([3]), array([4, 5]), array([6]),
array([7])]
Аргументы
batch_size Скаляр или вектор типа tf.int64, представляющий размер создаваемых батчей. Если этот аргумент является вектором, эти значения циклически перебираются по круговому алгоритму (round robin).
drop_remainder (Необязательно.) Скалярный tf.Tensor типа tf.bool, определяющий, следует ли отбрасывать последний батч, если в нем меньше элементов, чем batch_size[cycle_index]; поведение по умолчанию — не отбрасывать меньший батч.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Объект Dataset скалярных элементов типа dtype.

reduce

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

reduce(
    initial_state, reduce_func, name=None
)

Сворачивает входной набор данных в один элемент.

Преобразование последовательно вызывает reduce_func для каждого элемента входного набора данных, пока набор данных не будет исчерпан, агрегируя информацию в своем внутреннем состоянии. Аргумент initial_state используется в качестве начального состояния, а конечное состояние возвращается в качестве результата.

tf.data.Dataset.range(5).reduce(np.int64(0), lambda x, _: x + 1).numpy()
5
tf.data.Dataset.range(5).reduce(np.int64(0), lambda x, y: x + y).numpy()
10
Аргументы
initial_state Элемент, представляющий начальное состояние преобразования.
reduce_func Функция, отображающая (old_state, input_element) в new_state. Она должна принимать два аргумента и возвращать новый элемент. Структура new_state должна совпадать со структурой initial_state.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Элемент набора данных, соответствующий конечному состоянию преобразования.

rejection_resample

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

rejection_resample(
    class_func, target_dist, initial_dist=None, seed=None, name=None
) -> 'DatasetV2'

Выполняет ресэмплинг элементов для достижения целевого распределения.

Примечание: Эта реализация может отклонять или повторять элементы для достижения target_dist. Таким образом, в некоторых случаях выходной Dataset может быть больше, чем входной Dataset.
initial_dist = [0.6, 0.4]
n = 1000
elems = np.random.choice(len(initial_dist), size=n, p=initial_dist)
dataset = tf.data.Dataset.from_tensor_slices(elems)
zero, one = np.bincount(list(dataset.as_numpy_iterator())) / n

Из initial_dist следует, что zero составляет ~0.6, а one — ~0.4.

target_dist = [0.5, 0.5]
dataset = dataset.rejection_resample(
   class_func=lambda x: x,
   target_dist=target_dist,
   initial_dist=initial_dist)
dataset = dataset.map(lambda class_func_result, data: data)
zero, one = np.bincount(list(dataset.as_numpy_iterator())) / n

Из target_dist следует, что zero составляет ~0.5, а one — ~0.5.

Аргументы
class_func Функция, отображающая элемент входного набора данных в скалярный тензор tf.int32. Значения должны быть в диапазоне [0, num_classes).
target_dist Тензор с плавающей запятой формы [num_classes].
initial_dist (Необязательно.) Тензор с плавающей запятой формы [num_classes]. Если не указан, истинное распределение классов оценивается в реальном времени в потоковом режиме.
seed (Необязательно.) Целочисленное значение Python (seed) для ресэмплера.
name (Необязательно.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

repeat

View source

repeat(
    count=None, name=None
) -> 'DatasetV2'

Повторяет этот набор данных так, чтобы каждое исходное значение встречалось count раз.

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.repeat(3)
list(dataset.as_numpy_iterator())
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Примечание: Если входной набор данных зависит от глобального состояния (например, генератора случайных чисел) или его вывод недетерминирован (например, из-за предшествующего shuffle), то разные повторения могут создавать разные элементы.
Args
count (Необязательный.) Скалярный tf.Tensor типа tf.int64, представляющий количество повторений набора данных. Поведение по умолчанию (если count равно None или -1) заключается в бесконечном повторении набора данных.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

sample_from_datasets

View source

@staticmethod
sample_from_datasets(
    datasets,
    weights=None,
    seed=None,
    stop_on_empty_dataset=False,
    rerandomize_each_iteration=None
) -> 'DatasetV2'

Случайным образом выбирает элементы из наборов данных в datasets.

Создает набор данных путем чередования элементов из datasets с вероятностью weight[i] выбора элемента из набора данных i. Сэмплирование выполняется без возвращения. Например, предположим, что у нас есть 2 набора данных:

dataset1 = tf.data.Dataset.range(0, 3)
dataset2 = tf.data.Dataset.range(100, 103)

Предположим, что мы производим выборку из этих 2 наборов данных со следующими весами:

sample_dataset = tf.data.Dataset.sample_from_datasets(
    [dataset1, dataset2], weights=[0.5, 0.5])

Один из возможных вариантов элементов в sample_dataset:

print(list(sample_dataset.as_numpy_iterator()))
# [100, 0, 1, 101, 2, 102]
Args
datasets Непустой список объектов tf.data.Dataset с совместимой структурой.
weights (Необязательный.) Список или Tensor из len(datasets) значений с плавающей запятой, где weights[i] представляет вероятность выборки из datasets[i], или объект tf.data.Dataset, каждый элемент которого является таким списком. По умолчанию используется равномерное распределение по datasets.
seed (Необязательный.) Скалярный tf.Tensor типа tf.int64, представляющий случайное начальное значение (seed), которое будет использоваться для создания распределения. Подробнее о поведении см. в tf.random.set_seed.
stop_on_empty_dataset Если True, выборка прекращается при обнаружении пустого набора данных. Если False, выборка продолжается с пропуском пустых наборов данных. Рекомендуется установить значение True. В противном случае распределение выборок изначально соответствует намерениям пользователя, но может измениться по мере опустошения входных наборов данных. Это может быть трудно обнаружить, так как изначально набор данных выглядит корректно. По умолчанию имеет значение False для обратной совместимости.
rerandomize_each_iteration Необязательный аргумент bool. Булев аргумент определяет, будет ли последовательность случайных чисел, используемая для выбора набора данных, заново рандомизироваться в каждой эпохе. То есть он определяет, будут ли наборы данных сэмплироваться в одном и том же порядке в разных эпохах (поведение по умолчанию) или нет.
Returns
Набор данных, который случайным образом чередует элементы из datasets в соответствии с weights (если указано) или с равномерной вероятностью в противном случае.
Raises
TypeError Если аргументы datasets или weights имеют неверный тип.
ValueError
  • Если datasets пуст, или
  • Если параметр weights указан и не соответствует длине datasets.

save

View source

save(
    path, compression=None, shard_func=None, checkpoint_args=None
)

Сохраняет содержимое данного набора данных.

Пример использования:

import tempfile
path = os.path.join(tempfile.gettempdir(), "saved_data")
# Save a dataset
dataset = tf.data.Dataset.range(2)
dataset.save(path)
new_dataset = tf.data.Dataset.load(path)
for elem in new_dataset:
  print(elem)
  tf.Tensor(0, shape=(), dtype=int64)
  tf.Tensor(1, shape=(), dtype=int64)
  

Сохраненный набор данных сохраняется в нескольких файловых «шардах» (частях). По умолчанию вывод набора данных делится на шарды циклическим способом (round-robin), но пользовательское шардирование может быть задано с помощью функции shard_func. Например, вы можете сохранить набор данных с использованием одного шарда следующим образом:

dataset = make_dataset()
def custom_shard_func(element):
  return np.int64(0)
dataset.save(
    path="/path/to/data", ..., shard_func=custom_shard_func)

Чтобы включить создание контрольных точек (чекпоинтов), передайте checkpoint_args в метод save следующим образом:

dataset = tf.data.Dataset.range(100)
save_dir = "..."
checkpoint_prefix = "..."
step_counter = tf.Variable(0, trainable=False)
checkpoint_args = {
  "checkpoint_interval": 50,
  "step_counter": step_counter,
  "directory": checkpoint_prefix,
  "max_to_keep": 20,
}
dataset.save(dataset, save_dir, checkpoint_args=checkpoint_args)
Примечание: Структура каталогов и формат файлов, используемые для сохранения набора данных, считаются деталями реализации и могут измениться. По этой причине наборы данных, сохраненные с помощью tf.data.Dataset.save, должны загружаться только через tf.data.Dataset.load, для которого гарантируется обратная совместимость.
Args
path Обязательный. Директория для сохранения набора данных.
compression Необязательный. Алгоритм, используемый для сжатия данных при записи. Поддерживаемые варианты: GZIP и NONE. По умолчанию NONE.
shard_func Необязательный. Функция для управления сопоставлением элементов набора данных с файловыми шардами. Ожидается, что функция будет сопоставлять элементы входного набора данных с идентификаторами шардов int64. Если функция указана, она будет трассирована и выполнена как вычисление графа.
checkpoint_args Необязательные аргументы для чекпоинтов, которые будут переданы в tf.train.CheckpointManager. Если аргументы checkpoint_args не указаны, сохранение контрольных точек выполняться не будет. Реализация save() создает объект tf.train.Checkpoint внутри себя, поэтому пользователи не должны задавать аргумент checkpoint в checkpoint_args.
Returns
Операция, при выполнении которой происходит сохранение. При записи чекпоинтов возвращает None. Возвращаемое значение полезно в модульных тестах.
Raises
ValueError, если checkpoint передан в checkpoint_args.

scan

View source

scan(
    initial_state, scan_func, name=None
) -> 'DatasetV2'

Преобразование, сканирующее функцию по входному набору данных.

Это преобразование является сохраняющим состояние аналогом tf.data.Dataset.map. Помимо применения scan_func к элементам входного набора данных, scan() накапливает один или несколько тензоров состояния, начальными значениями которых являются initial_state.

dataset = tf.data.Dataset.range(10)
initial_state = tf.constant(0, dtype=tf.int64)
scan_func = lambda state, i: (state + i, state + i)
dataset = dataset.scan(initial_state=initial_state, scan_func=scan_func)
list(dataset.as_numpy_iterator())
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
Args
initial_state Вложенная структура тензоров, представляющая начальное состояние аккумулятора.
scan_func Функция, которая сопоставляет (old_state, input_element) с (new_state, output_element). Она должна принимать два аргумента и возвращать пару вложенных структур тензоров. Структура new_state должна соответствовать структуре initial_state.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

shard

View source

shard(
    num_shards, index, name=None
) -> 'DatasetV2'

Создает Dataset, содержащий только 1/num_shards часть этого набора данных.

shard детерминирован. Набор данных, созданный с помощью A.shard(n, i), будет содержать все элементы A, чей индекс mod n = i.

A = tf.data.Dataset.range(10)
B = A.shard(num_shards=3, index=0)
list(B.as_numpy_iterator())
[0, 3, 6, 9]
C = A.shard(num_shards=3, index=1)
list(C.as_numpy_iterator())
[1, 4, 7]
D = A.shard(num_shards=3, index=2)
list(D.as_numpy_iterator())
[2, 5, 8]

Этот оператор набора данных очень полезен при проведении распределенного обучения, поскольку позволяет каждому воркеру читать уникальное подмножество данных.

При чтении одного входного файла вы можете разделить элементы на шарды следующим образом:

d = tf.data.TFRecordDataset(input_file)
d = d.shard(num_workers, worker_index)
d = d.repeat(num_epochs)
d = d.shuffle(shuffle_buffer_size)
d = d.map(parser_fn, num_parallel_calls=num_map_threads)

Важные замечания:

  • Обязательно выполняйте шардирование перед использованием любых рандомизирующих операторов (таких как shuffle).
  • Обычно лучше всего использовать оператор shard на ранней стадии конвейера набора данных. Например, при чтении из набора файлов TFRecord выполняйте шардирование перед преобразованием набора данных во входные образцы. Это позволяет избежать чтения каждого файла каждым воркером. Ниже приведен пример эффективной стратегии шардирования внутри полного конвейера:
d = Dataset.list_files(pattern, shuffle=False)
d = d.shard(num_workers, worker_index)
d = d.repeat(num_epochs)
d = d.shuffle(shuffle_buffer_size)
d = d.interleave(tf.data.TFRecordDataset,
                 cycle_length=num_readers, block_length=1)
d = d.map(parser_fn, num_parallel_calls=num_map_threads)
Args
num_shards Скалярный tf.Tensor типа tf.int64, представляющий количество параллельно работающих шардов.
index Скалярный tf.Tensor типа tf.int64, представляющий индекс воркера.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.
Raises
InvalidArgumentError если num_shards или index являются недопустимыми значениями.
Примечание: проверка ошибок выполняется по мере возможности, и обнаружение ошибок при создании набора данных не гарантируется. (Например, передача тензора-плейсхолдера обходит раннюю проверку и вместо этого приведет к ошибке во время вызова session.run.)

shuffle

View source

shuffle(
    buffer_size, seed=None, reshuffle_each_iteration=None, name=None
) -> 'DatasetV2'

Случайным образом перемешивает элементы этого набора данных.

Этот набор данных заполняет буфер элементами в количестве buffer_size, затем случайным образом выбирает элементы из этого буфера, заменяя выбранные элементы новыми. Для идеального перемешивания требуется размер буфера, больший или равный полному размеру набора данных.

Например, если ваш набор данных содержит 10 000 элементов, но для buffer_size установлено значение 1 000, то shuffle сначала выберет случайный элемент только из первых 1 000 элементов буфера. После выбора элемента его место в буфере заменяется следующим (то есть 1001-м) элементом, сохраняя размер буфера в 1 000 элементов.

reshuffle_each_iteration определяет, должен ли порядок перемешивания отличаться для каждой эпохи. В TF 1.X стандартным способом создания эпох было преобразование repeat:

dataset = tf.data.Dataset.range(3)
dataset = dataset.shuffle(3, reshuffle_each_iteration=True)
dataset = dataset.repeat(2)
# [1, 0, 2, 1, 2, 0]

dataset = tf.data.Dataset.range(3)
dataset = dataset.shuffle(3, reshuffle_each_iteration=False)
dataset = dataset.repeat(2)
# [1, 0, 2, 1, 0, 2]

В TF 2.0 объекты tf.data.Dataset являются итерируемыми объектами Python, что позволяет создавать эпохи через итерацию Python:

dataset = tf.data.Dataset.range(3)
dataset = dataset.shuffle(3, reshuffle_each_iteration=True)
list(dataset.as_numpy_iterator())
# [1, 0, 2]
list(dataset.as_numpy_iterator())
# [1, 2, 0]
dataset = tf.data.Dataset.range(3)
dataset = dataset.shuffle(3, reshuffle_each_iteration=False)
list(dataset.as_numpy_iterator())
# [1, 0, 2]
list(dataset.as_numpy_iterator())
# [1, 0, 2]

Полное перемешивание всех данных

Чтобы перемешать весь набор данных, установите buffer_size=dataset.cardinality(). Это эквивалентно установке buffer_size равным количеству элементов в наборе данных, что приводит к равномерному перемешиванию.

Примечание: shuffle(dataset.cardinality()) загружает весь набор данных в память, чтобы его можно было перемешать. Это приведет к ошибке переполнения памяти (OOM), если набор данных слишком велик, поэтому полное перемешивание следует использовать только для наборов данных, которые гарантированно помещаются в памяти, таких как наборы имен файлов или другие небольшие наборы данных.
dataset = tf.data.Dataset.range(20)
dataset = dataset.shuffle(dataset.cardinality())
# [18, 4, 9, 2, 17, 8, 5, 10, 0, 6, 16, 3, 19, 7, 14, 11, 15, 13, 12, 1]
Args
buffer_size Скалярный tf.Tensor типа tf.int64, представляющий количество элементов из этого набора данных, из которых новый набор данных будет делать выборку. Для равномерного перемешивания всего набора данных используйте buffer_size=dataset.cardinality().
seed (Необязательный.) Скалярный tf.Tensor типа tf.int64, представляющий случайное начальное значение (seed), которое будет использоваться для создания распределения. Подробнее о поведении см. в tf.random.set_seed.
reshuffle_each_iteration (Необязательный.) Булево значение, которое, если оно истинно, указывает, что набор данных должен псевдослучайно перемешиваться заново при каждой итерации по нему. (По умолчанию True.)
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

skip

View source

skip(
    count, name=None
) -> 'DatasetV2'

Создает Dataset, который пропускает count элементов из этого набора данных.

dataset = tf.data.Dataset.range(10)
dataset = dataset.skip(7)
list(dataset.as_numpy_iterator())
[7, 8, 9]
Args
count Скалярный tf.Tensor типа tf.int64, представляющий количество элементов этого набора данных, которые следует пропустить для формирования нового набора данных. Если count больше размера этого набора данных, новый набор данных не будет содержать элементов. Если count равно -1, пропускается весь набор данных.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

snapshot

View source

snapshot(
    path,
    compression='AUTO',
    reader_func=None,
    shard_func=None,
    name=None
) -> 'DatasetV2'

API для сохранения вывода входного набора данных на постоянный носитель.

API snapshot позволяет пользователям прозрачно сохранять выходные данные своего конвейера предварительной обработки на диск и использовать предварительно обработанные данные в другом сеансе обучения.

Этот API позволяет объединить повторяющиеся шаги предварительной обработки и повторно использовать уже обработанные данные, жертвуя дисковым пространством и пропускной способностью сети ради освобождения более ценных ресурсов ЦП и времени вычислений на ускорителях.

В https://github.com/tensorflow/community/blob/master/rfcs/20200107-tf-data-snapshot.md содержится подробная проектная документация по этой функции.

Пользователи могут указывать различные параметры для управления поведением snapshot, включая то, как снимки считываются и записываются, передавая пользовательские функции в параметры reader_func и shard_func.

shard_func — это заданная пользователем функция, которая сопоставляет входные элементы с шардами снимка.

Пользователи могут захотеть определить эту функцию для управления тем, как файлы снимка должны записываться на диск. Ниже приведен пример того, как может быть написана потенциальная функция shard_func.

dataset = ...
dataset = dataset.enumerate()
dataset = dataset.snapshot("/path/to/snapshot/dir",
    shard_func=lambda x, y: x % NUM_SHARDS, ...)
dataset = dataset.map(lambda x, y: y)

reader_func — это заданная пользователем функция, принимающая один аргумент: (1) Dataset из Datasets, каждый из которых представляет собой «сплит» элементов исходного набора данных. Мощность (cardinality) входного набора данных соответствует количеству шардов, указанному в shard_func (см. выше). Функция должна возвращать Dataset элементов исходного набора данных.

Пользователи могут захотеть определить эту функцию для управления тем, как файлы снимка должны считываться с диска, включая степень перемешивания и параллелизма.

Вот пример стандартной функции чтения, которую может определить пользователь. Эта функция включает как перемешивание набора данных, так и параллельное чтение наборов данных:

def user_reader_func(datasets):
  # shuffle the datasets splits
  datasets = datasets.shuffle(NUM_CORES)
  # read datasets in parallel and interleave their elements
  return datasets.interleave(lambda x: x, num_parallel_calls=AUTOTUNE)

dataset = dataset.snapshot("/path/to/snapshot/dir",
    reader_func=user_reader_func)

По умолчанию snapshot распараллеливает чтение по количеству ядер, доступных в системе, но не пытается перемешивать данные.

Args
path Обязательный. Каталог, используемый для сохранения / загрузки снимка.
compression Необязательный. Тип сжатия, применяемый к снимку, записываемому на диск. Поддерживаемые параметры: GZIP, SNAPPY, AUTO или None. По умолчанию используется AUTO, при котором предпринимается попытка выбрать подходящий алгоритм сжатия для набора данных.
reader_func Необязательный. Функция для управления чтением данных из шардов снимка.
shard_func Необязательный. Функция для управления разделением данных на шарды при записи снимка.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

sparse_batch

View source

sparse_batch(
    batch_size, row_shape, name=None
) -> 'DatasetV2'

Объединяет последовательные элементы в tf.sparse.SparseTensor.

Как и Dataset.padded_batch(), это преобразование объединяет несколько последовательных элементов набора данных, которые могут иметь разные формы, в один элемент. Полученный элемент имеет три компонента (indices, values и dense_shape), которые составляют tf.sparse.SparseTensor, представляющий те же данные. row_shape представляет плотную форму каждой строки в результирующем tf.sparse.SparseTensor, к которой спереди добавляется эффективный размер батча. Например:

# NOTE: The following examples use `{ ... }` to represent the
# contents of a dataset.
a = { ['a', 'b', 'c'], ['a', 'b'], ['a', 'b', 'c', 'd'] }

a.apply(tf.data.experimental.dense_to_sparse_batch(
    batch_size=2, row_shape=[6])) ==
{
    ([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1]],  # indices
     ['a', 'b', 'c', 'a', 'b'],                 # values
     [2, 6]),                                   # dense_shape
    ([[0, 0], [0, 1], [0, 2], [0, 3]],
     ['a', 'b', 'c', 'd'],
     [1, 6])
}
Args
batch_size Скалярный tf.Tensor типа tf.int64, представляющий количество последовательных элементов этого набора данных для объединения в один батч.
row_shape Векторный тензороподобный объект tf.TensorShape или типа tf.int64, представляющий эквивалентную плотную форму строки в результирующем tf.sparse.SparseTensor. Каждый элемент этого набора данных должен иметь тот же ранг, что и row_shape, и должен иметь размер, меньший или равный row_shape по каждому измерению.
name (Необязательный.) Строка, указывающая имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

take

View source

take(
    count, name=None
) -> 'DatasetV2'

Создает Dataset, содержащий не более чем count элементов из этого набора данных.

dataset = tf.data.Dataset.range(10)
dataset = dataset.take(3)
list(dataset.as_numpy_iterator())
[0, 1, 2]
Args
count Скалярный tf.Tensor типа tf.int64, представляющий количество элементов этого набора данных, которые необходимо взять для формирования нового набора данных. Если count равно -1 или если count превышает размер этого набора данных, новый набор данных будет содержать все элементы этого набора данных.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

take_while

View source

take_while(
    predicate, name=None
) -> 'DatasetV2'

Преобразование, останавливающее итерацию по набору данных на основе predicate.

dataset = tf.data.Dataset.range(10)
dataset = dataset.take_while(lambda x: x < 5)
list(dataset.as_numpy_iterator())
[0, 1, 2, 3, 4]
Args
predicate Функция, которая сопоставляет вложенную структуру тензоров (имеющих формы и типы, определенные self.output_shapes и self.output_types) со скалярным тензором tf.bool.
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

unbatch

View source

unbatch(
    name=None
) -> 'DatasetV2'

Разделяет элементы набора данных на несколько элементов.

Например, если элементы набора данных имеют форму [B, a0, a1, ...], где B может различаться для каждого входного элемента, то для каждого элемента в наборе данных разделенный набор данных будет содержать B последовательных элементов формы [a0, a1, ...].

elements = [ [1, 2, 3], [1, 2], [1, 2, 3, 4] ]
dataset = tf.data.Dataset.from_generator(lambda: elements, tf.int64)
dataset = dataset.unbatch()
list(dataset.as_numpy_iterator())
[1, 2, 3, 1, 2, 1, 2, 3, 4]
Примечание: unbatch требует копирования данных для разделения объединенного в батч тензора на более мелкие, необъединенные тензоры. При оптимизации производительности старайтесь избегать ненужного использования unbatch.
Args
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

unique

View source

unique(
    name=None
) -> 'DatasetV2'

Преобразование, удаляющее повторяющиеся элементы из Dataset.

Используйте это преобразование для создания набора данных, содержащего по одному экземпляру каждого уникального элемента во входных данных. Например:

dataset = tf.data.Dataset.from_tensor_slices([1, 37, 2, 37, 2, 1])
dataset = dataset.unique()
sorted(list(dataset.as_numpy_iterator()))
[1, 2, 37]
Примечание: Это преобразование поддерживает только те наборы данных, которые помещаются в памяти и содержат элементы типов tf.int32, tf.int64 или tf.string.
Args
name (Необязательный.) Имя для операции tf.data.
Returns
Новый Dataset с примененным преобразованием, как описано выше.

window

View source

window(
    size, shift=None, stride=1, drop_remainder=False, name=None
) -> 'DatasetV2'

Возвращает набор данных «окон» (windows).

Каждое «окно» — это набор данных, содержащий подмножество элементов входного набора данных. Это конечные наборы данных размером size (или, возможно, меньше, если входных элементов недостаточно для заполнения окна и значение drop_remainder равно False).

Например:

dataset = tf.data.Dataset.range(7).window(3)
for window in dataset:
  print(window)
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>
<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int64, name=None)>

Поскольку окна являются наборами данных, по ним можно выполнять итерацию:

for window in dataset:
  print(list(window.as_numpy_iterator()))
[0, 1, 2]
[3, 4, 5]
[6]

Shift

Аргумент shift определяет количество входных элементов для сдвига между началом каждого окна. Если окна и элементы нумеруются с 0, первый элемент в окне k будет элементом k * shift входного набора данных. В частности, первый элемент первого окна всегда будет первым элементом входного набора данных.

dataset = tf.data.Dataset.range(7).window(3, shift=1,
                                          drop_remainder=True)
for window in dataset:
  print(list(window.as_numpy_iterator()))
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]

Шаг (stride)

Аргумент stride определяет шаг между входными элементами внутри окна.

dataset = tf.data.Dataset.range(7).window(3, shift=1, stride=2,
                                          drop_remainder=True)
for window in dataset:
  print(list(window.as_numpy_iterator()))
[0, 2, 4]
[1, 3, 5]
[2, 4, 6]

Вложенные элементы

Когда преобразование window применяется к набору данных, элементы которого являются вложенными структурами, оно создает набор данных, в котором элементы имеют ту же вложенную структуру, но каждый лист заменен окном. Другими словами, вложенность применяется снаружи окон, а не внутри них.

Сигнатура типа:

def window(
    self: Dataset[Nest[T]], ...
) -> Dataset[Nest[Dataset[T]]]

Применение window к Dataset кортежей возвращает кортеж окон:

dataset = tf.data.Dataset.from_tensor_slices(([1, 2, 3, 4, 5],
                                              [6, 7, 8, 9, 10]))
dataset = dataset.window(2)
windows = next(iter(dataset))
windows
(<...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int32, name=None)>,
 <...Dataset element_spec=TensorSpec(shape=(), dtype=tf.int32, name=None)>)
def to_numpy(ds):
  return list(ds.as_numpy_iterator())

for windows in dataset:
  print(to_numpy(windows[0]), to_numpy(windows[1]))
[1, 2] [6, 7]
[3, 4] [8, 9]
[5] [10]

Применение window к Dataset словарей возвращает словарь из Datasets:

dataset = tf.data.Dataset.from_tensor_slices({'a': [1, 2, 3],
                                              'b': [4, 5, 6],
                                              'c': [7, 8, 9]})
dataset = dataset.window(2)
def to_numpy(ds):
  return list(ds.as_numpy_iterator())

for windows in dataset:
  print(tf.nest.map_structure(to_numpy, windows))
{'a': [1, 2], 'b': [4, 5], 'c': [7, 8]}
{'a': [3], 'b': [6], 'c': [9]}

Преобразование набора данных окон в плоский список

Методы Dataset.flat_map и Dataset.interleave можно использовать для объединения набора данных окон в один плоский набор данных.

Аргументом для flat_map является функция, которая принимает элемент из набора данных и возвращает Dataset. flat_map последовательно объединяет результирующие наборы данных.

Например, чтобы превратить каждое окно в плотный тензор:

dataset = tf.data.Dataset.range(7).window(3, shift=1,
                                          drop_remainder=True)
batched = dataset.flat_map(lambda x:x.batch(3))
for batch in batched:
  print(batch.numpy())
[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]
Аргументы
size Скалярный tf.Tensor типа tf.int64, представляющий количество элементов входного набора данных, объединяемых в окно. Должен быть положительным.
shift (Опционально.) Скалярный tf.Tensor типа tf.int64, представляющий количество входных элементов, на которое перемещается окно на каждой итерации. По умолчанию равен size. Должен быть положительным.
stride (Опционально.) Скалярный tf.Tensor типа tf.int64, представляющий шаг входных элементов в скользящем окне. Должен быть положительным. Значение по умолчанию 1 означает «сохранять каждый входной элемент».
drop_remainder (Опционально.) Скалярный tf.Tensor типа tf.bool, определяющий, следует ли отбрасывать последние окна, если их размер меньше, чем size.
name (Опционально.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

with_options

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

with_options(
    options, name=None
) -> 'DatasetV2'

Возвращает новый tf.data.Dataset с заданными параметрами.

Параметры являются «глобальными» в том смысле, что они применяются ко всему набору данных. Если параметры задаются несколько раз, они объединяются, пока разные параметры не используют различные значения, отличные от значений по умолчанию.

ds = tf.data.Dataset.range(5)
ds = ds.interleave(lambda x: tf.data.Dataset.range(5),
                   cycle_length=3,
                   num_parallel_calls=3)
options = tf.data.Options()
# This will make the interleave order non-deterministic.
options.deterministic = False
ds = ds.with_options(options)
Аргументы
options Объект tf.data.Options, определяющий используемые параметры.
name (Опционально.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.
Исключения
ValueError если параметр устанавливается более одного раза со значением, отличным от значения по умолчанию

zip

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

@staticmethod
zip(
    *args, datasets=None, name=None
) -> 'DatasetV2'

Создает Dataset путем объединения (zipping) указанных наборов данных.

Этот метод имеет семантику, аналогичную встроенной функции zip() в Python, с той лишь разницей, что аргумент datasets может быть (вложенной) структурой объектов Dataset. Поддерживаемые механизмы вложенности описаны здесь.

# The datasets or nested structure of datasets `*args` argument
# determines the structure of elements in the resulting dataset.
a = tf.data.Dataset.range(1, 4)  # ==> [ 1, 2, 3 ]
b = tf.data.Dataset.range(4, 7)  # ==> [ 4, 5, 6 ]
ds = tf.data.Dataset.zip(a, b)
list(ds.as_numpy_iterator())
[(1, 4), (2, 5), (3, 6)]
ds = tf.data.Dataset.zip(b, a)
list(ds.as_numpy_iterator())
[(4, 1), (5, 2), (6, 3)]

# The `datasets` argument may contain an arbitrary number of datasets.
c = tf.data.Dataset.range(7, 13).batch(2)  # ==> [ [7, 8],
                                           #       [9, 10],
                                           #       [11, 12] ]
ds = tf.data.Dataset.zip(a, b, c)
for element in ds.as_numpy_iterator():
  print(element)
(1, 4, array([7, 8]))
(2, 5, array([ 9, 10]))
(3, 6, array([11, 12]))

# The number of elements in the resulting dataset is the same as
# the size of the smallest dataset in `datasets`.
d = tf.data.Dataset.range(13, 15)  # ==> [ 13, 14 ]
ds = tf.data.Dataset.zip(a, d)
list(ds.as_numpy_iterator())
[(1, 13), (2, 14)]
Аргументы
*args Наборы данных или вложенные структуры наборов данных для объединения. Не может быть задан, если задан datasets.
datasets (Вложенная) структура наборов данных. Не может быть задана, если задан *args. Обратите внимание, что этот аргумент существует только для обратной совместимости, предпочтительно использовать *args.
name (Опционально.) Имя для операции tf.data.
Возвращает
Новый Dataset с примененным преобразованием, как описано выше.

__bool__

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

__bool__()

__iter__

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

__iter__()

Создает итератор для элементов этого набора данных.

Возвращаемый итератор реализует протокол Iterator языка Python.

Возвращает
Объект tf.data.Iterator для элементов этого набора данных.
Исключения
RuntimeError Если вызов происходит не внутри tf.function и не в режиме eager execution.

__len__

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

__len__()

Возвращает длину набора данных, если она известна и конечна.

Этот метод требует выполнения в eager-режиме, а также чтобы длина набора данных была известна и не была бесконечной. Если длина может быть неизвестной или бесконечной, или если вы работаете в графовом режиме (graph mode), используйте вместо этого tf.data.Dataset.cardinality.

Возвращает
Целое число, представляющее длину набора данных.
Исключения
RuntimeError Если длина набора данных неизвестна или бесконечна, либо если режим eager execution не включен.

__nonzero__

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

__nonzero__()

© 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/compat/v1/data/experimental/SqlDataset

Spec-Zone.ru

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