Spec-Zone.ru › TensorFlow

tf.data.TFRecordDataset

Dataset, содержащий записи из одного или нескольких файлов TFRecord.

Наследует: Dataset

tf.data.TFRecordDataset(
    filenames,
    compression_type=None,
    buffer_size=None,
    num_parallel_reads=None,
    name=None
)

Используется в блокнотах

Используется в руководстве Используется в учебных материалах
  • tf.data: создание входных конвейеров TensorFlow
  • TFRecord и tf.train.Example
  • Обучение структурированных нейронных сетей на графах в TFX
  • Рекомендации фильмов: модели-рекомендатели в TFX
  • Знакомство с индикаторами справедливости
  • Сегментация экземпляров с помощью Model Garden

Этот набор данных загружает записи TFRecord из файлов в виде байтов — в точности так, как они были записаны.TFRecordDataset самостоятельно не выполняет синтаксический анализ или декодирование. Синтаксический анализ и декодирование можно выполнить, применив преобразования Dataset.map после TFRecordDataset.

Ниже приведен минимальный пример:

import tempfile
example_path = os.path.join(tempfile.gettempdir(), "example.tfrecords")
np.random.seed(0)
# Write the records to a file.
with tf.io.TFRecordWriter(example_path) as file_writer:
  for _ in range(4):
    x, y = np.random.random(), np.random.random()

    record_bytes = tf.train.Example(features=tf.train.Features(feature={
        "x": tf.train.Feature(float_list=tf.train.FloatList(value=[x])),
        "y": tf.train.Feature(float_list=tf.train.FloatList(value=[y])),
    })).SerializeToString()
    file_writer.write(record_bytes)
# Read the data back out.
def decode_fn(record_bytes):
  return tf.io.parse_single_example(
      # Data
      record_bytes,

      # Schema
      {"x": tf.io.FixedLenFeature([], dtype=tf.float32),
       "y": tf.io.FixedLenFeature([], dtype=tf.float32)}
  )
for batch in tf.data.TFRecordDataset([example_path]).map(decode_fn):
  print("x = {x:.4f},  y = {y:.4f}".format(**batch))
x = 0.5488,  y = 0.7152
x = 0.6028,  y = 0.5449
x = 0.4237,  y = 0.6459
x = 0.4376,  y = 0.8918
Аргументы
filenames Тензор tf.string или tf.data.Dataset, содержащий одно или несколько имен файлов.
compression_type (Необязательно.) Скалярный tf.string, принимающий одно из значений: "" (без сжатия), "ZLIB" или "GZIP".
buffer_size (Необязательно.) Скалярный tf.int64, задающий количество байтов в буфере чтения. Если пропускная способность конвейера ввода ограничена операциями ввода-вывода, задайте для этого параметра значение от 1 до 100 МБ. Если None, используется разумное значение по умолчанию для локальных и удаленных файловых систем.
num_parallel_reads (Необязательно.) Скалярный tf.int64, задающий количество файлов для параллельного чтения. Если значение больше единицы, записи из файлов, читаемых параллельно, выводятся в чередующемся порядке. Если пропускная способность конвейера ввода ограничена операциями ввода-вывода, задайте для этого параметра значение больше единицы, чтобы распараллелить ввод-вывод. Если None, файлы будут читаться последовательно.
name (Необязательно.) Имя операции tf.data.
Вызывает исключения
TypeError Если какой-либо аргумент имеет тип, отличный от ожидаемого.
ValueError Если форма какого-либо аргумента отличается от ожидаемой.
Атрибуты
element_spec Спецификация типа элемента этого набора данных.
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset.element_spec
TensorSpec(shape=(), dtype=tf.int32, name=None)

Дополнительные сведения см. в этом руководстве.

Методы

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 и того, чтобы 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.int64 tf.Tensor, задающий количество последовательных элементов этого набора данных, объединяемых в один пакет.
drop_remainder (Необязательно.) Скалярный тензор tf.bool tf.Tensor, указывающий, следует ли отбросить последний пакет, если в нем меньше batch_size элементов; по умолчанию пакет меньшего размера не отбрасывается.
num_parallel_calls (Необязательно.) Скалярный тензор tf.int64 tf.Tensor, задающий количество пакетов, вычисляемых асинхронно параллельно. Если не задано, пакеты вычисляются последовательно. Если используется значение 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 по корзинам в зависимости от длины.

Элементы Dataset группируются по длине, затем выполняется дополнение и формирование пакетов.

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

Ниже приведен пример распределения входных данных по трем корзинам "[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. По умолчанию дополнение выполняется нулями.
pad_to_bucket_boundary Логическое значение: если False, измерения неизвестного размера дополняются до максимальной длины в пакете. Если True, измерения неизвестного размера дополняются до границы корзины минус 1 (то есть до максимальной длины в каждой корзине); вызывающий код должен гарантировать, что исходный Dataset не содержит элементов длиной больше max(bucket_boundaries).
no_padding bool, указывает, следует ли дополнять признаки пакета (признаки должны иметь тип tf.sparse.SparseTensor или одинаковую форму).
drop_remainder (Необязательно.) Скалярный тензор tf.bool tf.Tensor, указывающий, следует ли отбросить последний пакет, если в нем меньше 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.string tf.Tensor, задающий имя каталога в файловой системе для кэширования элементов этого набора данных. Если имя файла не указано, набор данных кэшируется в памяти.
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
Возвращает
Скалярный тензор tf.int64 Tensor, представляющий мощность набора данных. Если мощность бесконечна или неизвестна, 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.int64 tf.Tensor, задающий начальное значение для нумерации.
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 с примененным описанным выше преобразованием.

fingerprint

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

fingerprint()

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

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

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

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

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

flat_map

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

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

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

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

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

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

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. В этом случае предполагается, что результат состоит из объектов с классами, формами и типами, заданными объектами 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_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, а немедленное выполнение не включено, значения будут встроены в граф в виде одной или нескольких операций 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, а немедленное выполнение не включено, значения будут встроены в граф в виде одной или нескольких операций 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 длины BATCH_SIZE был преобразован в tf.data.Dataset. Затем каждый из raw_feature был обработан с помощью preprocessing_fn, а обработанные признаки были объединены в один пакет. Итоговый dataset содержит только один элемент — пакет со всеми обработанными признаками.

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

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

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

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 (Необязательно.) Логическое значение, указывающее, следует ли записывать игнорируемые ошибки в 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 содержит операции с состоянием, порядок доступа к этому состоянию не определен.

Производительность часто можно повысить, задав 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. Если имена файлов уже получены с помощью 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, задающий начальное значение генератора случайных чисел для создания распределения. Описание поведения см. в разделе 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 не указан, а метод выполняется в режиме графа.

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 (немедленное выполнение или граф), 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 в целом исключает возможность параллельного выполнения пользовательских преобразований (из-за GIL Python).

Производительность часто можно повысить, задав 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 содержит операции с состоянием и num_parallel_calls > 1, порядок доступа к этому состоянию не определен, поэтому значения выходных элементов могут быть недетерминированными независимо от значения флага deterministic.

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

options

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

options()

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

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

padded_batch

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

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

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

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

Как и в случае с 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.int64 tf.Tensor, задающий количество последовательных элементов этого набора данных, объединяемых в один пакет.
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.bool tf.Tensor, указывающий, следует ли отбрасывать последний пакет, если в нем меньше 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. Это позволяет подготавливать последующие элементы, пока обрабатывается текущий элемент. Часто это повышает производительность и пропускную способность, но требует дополнительной памяти для хранения предварительно загруженных элементов.

Примечание: Как и другие методы Dataset, предварительная загрузка выполняется для элементов входного набора данных. Метод не различает примеры и пакеты. 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.int64 tf.Tensor, задающий максимальное количество элементов, которые будут буферизованы при предварительной загрузке. Если используется значение 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 с переменной длиной по всем таким измерениям.
  • Если входной элемент — это 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.int64 tf.Tensor, задающий количество последовательных элементов этого набора данных, объединяемых в один пакет.
drop_remainder (Необязательно.) Скалярный tf.bool tf.Tensor, указывающий, следует ли отбрасывать последний пакет, если в нем меньше batch_size элементов; по умолчанию меньший пакет не отбрасывается.
row_splits_dtype Тип данных, который следует использовать для row_splits новых тензоров с переменной длиной. У существующих элементов tf.RaggedTensor тип данных 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: ожидаемый тип данных. (Необязательно, по умолчанию: 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, задающий размеры создаваемых пакетов. Если этот аргумент является вектором, значения циклически перебираются по кругу.
drop_remainder (Необязательно.) Скалярный tf.bool tf.Tensor, указывающий, следует ли отбрасывать последний пакет, если в нем меньше 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, используемое в качестве начального значения для повторной выборки.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый Dataset с преобразованием, примененным, как описано выше.

repeat

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

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), при разных повторениях могут создаваться разные элементы.
Аргументы
count (Необязательно.) Скалярный tf.int64 tf.Tensor, задающий количество повторений набора данных. По умолчанию (если count равно None или -1) набор данных повторяется бесконечно.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый Dataset с преобразованием, примененным, как описано выше.

sample_from_datasets

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

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

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

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

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

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

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]
Аргументы
datasets Непустой список объектов tf.data.Dataset с совместимой структурой.
weights (Необязательно.) Список или тензор из len(datasets) значений с плавающей точкой, где weights[i] задает вероятность выбора элемента из datasets[i], либо объект tf.data.Dataset, каждый элемент которого представляет собой такой список. По умолчанию используется равномерное распределение по datasets.
seed (Необязательно.) Скалярный tf.int64 tf.Tensor, задающий начальное значение генератора случайных чисел, используемое для создания распределения. См. описание поведения в разделе tf.random.set_seed.
stop_on_empty_dataset Если задано значение True, выборка останавливается при обнаружении пустого набора данных. Если задано значение False, выборка продолжается, а пустые наборы данных пропускаются. Рекомендуется задать значение True. В противном случае распределение выборки сначала будет соответствовать заданному пользователем, но может измениться, когда входные наборы данных опустеют. Это может быть сложно обнаружить, поскольку изначально набор данных выглядит корректно. Для обеспечения обратной совместимости по умолчанию используется False.
rerandomize_each_iteration Необязательный параметр bool. Логический аргумент управляет тем, будет ли последовательность случайных чисел, используемая для выбора набора данных, генерироваться заново в каждой эпохе. Иными словами, он определяет, будут ли наборы данных выбираться в одинаковом порядке в разных эпохах (поведение по умолчанию).
Возвращает
Набор данных, в котором элементы из datasets перемежаются в случайном порядке согласно weights, если этот параметр задан; в противном случае используется равномерная вероятность.
Вызывает исключение
TypeError Если аргументы datasets или weights имеют неверный тип.
ValueError
  • Если datasets пуст, или
  • если задан weights и его длина не совпадает с длиной datasets.

save

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

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)
  

Набор данных сохраняется в нескольких файлах («сегментах»). По умолчанию выходные данные набора данных распределяются по сегментам по кругу, однако пользовательское распределение можно задать с помощью функции 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, для которого гарантирована обратная совместимость.
Аргументы
path Обязательный параметр. Каталог для сохранения набора данных.
compression Необязательный параметр. Алгоритм сжатия данных при записи. Поддерживаются варианты GZIP и NONE. По умолчанию используется NONE.
shard_func Необязательный параметр. Функция, управляющая распределением элементов набора данных по файловым сегментам. Функция должна отображать элементы входного набора данных в целочисленные идентификаторы сегментов int64. Если функция задана, она будет трассирована и выполнена как вычисление графа.
checkpoint_args Необязательные аргументы для создания контрольных точек, которые будут переданы в tf.train.CheckpointManager. Если параметры checkpoint_args не указаны, контрольные точки создаваться не будут. Реализация save() создает объект tf.train.Checkpoint внутри себя, поэтому пользователям не следует задавать аргумент checkpoint в checkpoint_args.
Возвращает
Операцию, выполнение которой сохраняет данные. При записи контрольных точек возвращает None. Возвращаемое значение полезно в модульных тестах.
Вызывает исключение
ValueError, если в checkpoint_args передано значение checkpoint.

scan

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

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]
Аргументы
initial_state Вложенная структура тензоров, представляющая начальное состояние аккумулятора.
scan_func Функция, отображающая (old_state, input_element) в (new_state, output_element). Она должна принимать два аргумента и возвращать пару вложенных структур тензоров. new_state должна соответствовать структуре initial_state.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

shard

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

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).
  • Как правило, оператор разделения на шарды лучше использовать в начале конвейера обработки набора данных. Например, при чтении из набора файлов 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)
Аргументы
num_shards Скалярный tf.int64 tf.Tensor, представляющий число параллельно работающих шардов.
index Скалярный tf.int64 tf.Tensor, представляющий индекс рабочего процесса.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.
Вызывает исключение
InvalidArgumentError если num_shards или index имеют недопустимые значения.
Примечание: проверка ошибок выполняется по мере возможности, и при создании набора данных ошибки не обязательно будут обнаружены. (Например, передача тензора-заполнителя позволяет обойти раннюю проверку; вместо этого ошибка возникнет во время вызова session.run.)

shuffle

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

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

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

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

Например, если набор данных содержит 10 000 элементов, а buffer_size равно 1 000, то shuffle сначала выберет случайный элемент только из первых 1 000 элементов буфера. После выбора элемента его место в буфере займёт следующий элемент (то есть элемент 1 001), при этом размер буфера останется равным 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]
Аргументы
buffer_size Скалярный tf.int64 tf.Tensor, представляющий число элементов этого набора данных, из которых будет выполняться выборка для нового набора данных. Чтобы равномерно перемешать весь набор данных, используйте buffer_size=dataset.cardinality().
seed (Необязательно.) Скалярный tf.int64 tf.Tensor, представляющий случайное начальное значение, используемое для создания распределения. Описание поведения см. в разделе tf.random.set_seed.
reshuffle_each_iteration (Необязательно.) Логическое значение; если оно равно true, набор данных будет псевдослучайно перемешиваться каждый раз при итерации по нему. (По умолчанию — True.)
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

skip

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

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]
Аргументы
count Скалярный tf.int64 tf.Tensor, представляющий число элементов этого набора данных, которые нужно пропустить для формирования нового набора данных. Если count больше размера этого набора данных, новый набор данных не будет содержать элементов. Если count равно -1, пропускается весь набор данных.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

snapshot

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

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) набор данных, состоящий из наборов данных, каждый из которых представляет собой «разбиение» элементов исходного набора данных. Кардинальность входного набора данных соответствует числу шардов, заданному в shard_func (см. выше). Функция должна возвращать набор данных с элементами исходного набора данных.

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

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

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 выполняет параллельное чтение с использованием числа ядер, доступных в системе, но не пытается перемешивать данные.

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

sparse_batch

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

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])
}
Аргументы
batch_size Скалярный tf.int64 tf.Tensor, представляющий число последовательных элементов этого набора данных, объединяемых в один пакет.
row_shape Объект, подобный векторному тензору типа tf.TensorShape или tf.int64, представляющий эквивалентную плотную форму строки в результирующем tf.sparse.SparseTensor. Ранг каждого элемента этого набора данных должен совпадать с рангом row_shape, а размерность каждого измерения должна быть не больше row_shape.
name (Необязательно.) Строка, задающая имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

take

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

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]
Аргументы
count Скалярный tf.int64 tf.Tensor, представляющий число элементов этого набора данных, которые нужно взять для формирования нового набора данных. Если count равно -1 или count превышает размер этого набора данных, новый набор данных будет содержать все его элементы.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

take_while

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

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]
Аргументы
predicate Функция, отображающая вложенную структуру тензоров (с формами и типами, заданными self.output_shapes и self.output_types) в скалярный тензор типа tf.bool.
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

unbatch

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

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 без необходимости.
Аргументы
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

unique

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

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.
Аргументы
name (Необязательно.) Имя операции tf.data.
Возвращает
Новый объект Dataset с применённым описанным выше преобразованием.

window

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

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

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

Каждое «окно» — это набор данных, содержащий подмножество элементов входного набора. Такие наборы данных конечны и содержат 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 задаёт число входных элементов, на которое нужно сдвинуться между началами окон. Если нумерация окон и элементов начинается с 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 задаёт шаг между входными элементами внутри окна.

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.int64 tf.Tensor, представляющий число элементов входного набора данных, объединяемых в окно. Должен быть положительным.
shift (Необязательно.) Скалярный tf.int64 tf.Tensor, представляющий число входных элементов, на которое сдвигается окно при каждой итерации. По умолчанию — size. Должен быть положительным.
stride (Необязательно.) Скалярный tf.int64 tf.Tensor, представляющий шаг входных элементов в скользящем окне. Должен быть положительным. Значение по умолчанию 1 означает «сохранять каждый входной элемент».
drop_remainder (Необязательно.) Скалярный tf.bool tf.Tensor, указывающий, следует ли отбрасывать последние окна, если их размер меньше 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, объединяя в пары заданные наборы данных.

Семантика этого метода похожа на семантику встроенной функции 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_ops.OwnedIterator

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

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

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

__len__

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

__len__()

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

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

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

__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/data/TFRecordDataset

Spec-Zone.ru

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