(Необязательно.) Скаляр tf.string, принимающий одно из значений "" (без сжатия), "ZLIB", или "GZIP".
buffer_size
(Необязательно.) Скаляр tf.int64, представляющий количество байтов в буфере чтения. Если ваша цепочка обработки данных ограничена ввода-выводом, рассмотрите возможность установки этого параметра на значение от 1 до 100 МБ. Если None, используется разумное значение по умолчанию для локальных и удаленных файловых систем.
num_parallel_reads
(Необязательно.) Скаляр tf.int64, представляющий количество файлов для одновременного чтения. Если значение больше единицы, записи из прочитанных файлов выводятся в переплетенном порядке. Если ваша цепочка обработки данных ограничена вводом-выводом, рассмотрите возможность установки этого параметра на значение больше единицы для паралелизации ввода-вывода. Если None, файлы будут читаться последовательно.
Исключения
TypeError
Если какой-либо аргумент не имеет ожидаемого типа.
ValueError
Если какой-либо аргумент не имеет ожидаемой формы.
Атрибуты
element_spec
Спецификация типа элемента этого набора данных.
output_classes
Возвращает класс каждого компонента элемента этого набора данных. (устарело)
output_shapes
Возвращает форму каждого компонента элемента этого набора данных. (устарело)
output_types
Возвращает тип каждого компонента элемента этого набора данных. (устарело)
Применяет функцию преобразования к этому набору данных.
apply позволяет объединять пользовательские Dataset преобразования, которые представлены как функции, принимающие один Dataset аргумент и возвращающие преобразованный Dataset.
Например:
dataset = (dataset.map(lambda x: x ** 2)
.apply(group_by_window(key_func, reduce_func, window_size))
.map(lambda x: x ** 3))
Аргументы
transformation_func
Функция, принимающая один Dataset аргумент и возвращающая Dataset.
Возвращаемое значение
Dataset
Dataset возвращаемый в результате применения transformation_func к этому набору данных.
Объединяет последовательные элементы этого набора данных в пакеты.
Компоненты результирующего элемента будут иметь дополнительное внешнее измерение, которое будет batch_size (или N % batch_size для последнего элемента, если batch_size не делит равномерно количество входных элементов N и drop_remainder равно False). Если ваше приложение зависит от того, что пакеты имеют одинаковое внешнее измерение, вы должны установить аргумент drop_remainder на True, чтобы предотвратить создание меньшего пакета.
Аргументы
batch_size
Скаляр tf.int64tf.Tensor, представляющий количество последовательных элементов этого набора данных для объединения в один пакет.
drop_remainder
(Необязательно.) Скаляр tf.booltf.Tensor, указывающий, должен ли быть пропущен последний пакет в случае, если он содержит меньше batch_size элементов; поведение по умолчанию — не пропускать меньший пакет.
Скаляр tf.stringtf.Tensor, представляющий имя каталога в файловой системе, используемой для кэширования элементов в этом наборе данных. Если имя файла не указано, набор данных будет кэширован в памяти.
Создает Dataset, конкатенируя заданный набор данных с этим набором данных.
a = Dataset.range(1, 4) # ==> [ 1, 2, 3 ]
b = Dataset.range(4, 8) # ==> [ 4, 5, 6, 7 ]
# The input dataset and dataset to be concatenated should have the same
# nested structures and output types.
# c = Dataset.range(8, 14).batch(2) # ==> [ [8, 9], [10, 11], [12, 13] ]
# d = Dataset.from_tensor_slices([14.0, 15.0, 16.0])
# a.concatenate(c) and a.concatenate(d) would result in error.
a.concatenate(b) # ==> [ 1, 2, 3, 4, 5, 6, 7 ]
# NOTE: The following examples use `{ ... }` to represent the
# contents of a dataset.
a = { 1, 2, 3 }
b = { (7, 8), (9, 10) }
# The nested structure of the `datasets` argument determines the
# structure of elements in the resulting dataset.
a.enumerate(start=5)) == { (5, 1), (6, 2), (7, 3) }
b.enumerate() == { (0, (7, 8)), (1, (9, 10)) }
Аргументы
start
Скаляр tf.int64tf.Tensor, представляющий начальное значение для нумерации.
Фильтры этого набора данных согласно predicate. (устарело)
Примечание: Это «лазейка» для существующих вариантов использования filter которые не работают с функциями V2. Новые использования категорически не рекомендуются, а существующие должны быть перенесены на filter, так как этот метод будет удален в V2.
Аргументы
predicate
Функция, отображающая вложенную структуру тензоров (с формами и типами, определенными self.output_shapes и self.output_types), в скалярный tf.bool тензор.
Возвращаемое значение
Dataset
Объект Dataset, содержащий элементы этого набора данных, для которых predicate имеет значение True.
Применяет функцию map_func к этому набору данных и уплощает результат.
Используйте flat_map , если вы хотите убедиться, что порядок вашего набора данных сохранится. Например, для уплотнения набора данных из партий в набор их элементов:
Создаёт набор данных Dataset, элементы которого генерируются generator.
Аргумент generator должен быть вызываемым объектом, который возвращает объект, поддерживающий протокол iter() (например, функцию-генератор). Элементы, сгенерированные generator должны быть совместимы с заданными аргументами output_types и (необязательными) output_shapes.
Например:
import itertools
tf.compat.v1.enable_eager_execution()
def gen():
for i in itertools.count(1):
yield (i, [1] * i)
ds = tf.data.Dataset.from_generator(
gen, (tf.int64, tf.int64), (tf.TensorShape([]), tf.TensorShape([None])))
for value in ds.take(2):
print value
# (1, array([1]))
# (2, array([1, 1]))
Примечание: Текущая реализация Dataset.from_generator() использует tf.numpy_function и наследует те же ограничения. В частности, он требует, чтобы операции, связанные с Dataset и Iterator, размещались на устройстве в том же процессе, что и Python-программа, вызвавшая Dataset.from_generator(). Тело generator не будет сериализовано в GraphDef, и вы не должны использовать этот метод, если вам нужно сериализовать вашу модель и восстановить её в другой среде.
Примечание: Если generator зависит от изменяемых глобальных переменных или другого внешнего состояния, учтите, что среда выполнения может вызвать generator несколько раз (для поддержки повторения Dataset) и в любое время между вызовом Dataset.from_generator() и производством первого элемента генератора. Изменение глобальных переменных или внешнего состояния может привести к неопределённому поведению, и мы рекомендуем явным образом кэшировать любое внешнее состояние в generator перед вызовом Dataset.from_generator().
Аргументы
generator
Вызываемый объект, который возвращает объект, поддерживающий протокол iter(). Если args не указан, generator не должен принимать аргументов; в противном случае он должен принимать столько аргументов, сколько значений в args.
output_types
Вложенная структура объектов tf.DType, соответствующих каждому компоненту элемента, выдаваемого generator.
output_shapes
(Необязательно.) Вложенная структура объектов tf.TensorShape, соответствующих каждому компоненту элемента, выдаваемого generator.
args
(Необязательно.) Кортеж объектов tf.Tensor, которые будут вычислены и переданы generator в качестве аргументов массивов NumPy.
Создаёт набор данных Dataset, элементы которого являются срезами заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, и выполнение в режиме eager отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к потере памяти и ограничениям размера сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативный подход, описанный в этом руководстве.
Аргументы
tensors
Элемент набора данных, при этом каждый компонент имеет одинаковый размер в 0-м измерении.
Создаёт набор данных Dataset с одним элементом, состоящим из заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, и выполнение в режиме eager отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к потере памяти и ограничениям размера сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативный подход, описанный в этом руководстве.
Применяет функцию map_func к этому набору данных и переплетает результаты.
Например, вы можете использовать Dataset.interleave() для одновременной обработки многих входных файлов:
# Preprocess 4 files concurrently, and interleave blocks of 16 records from
# each file.
filenames = ["/var/data/file1.txt", "/var/data/file2.txt", ...]
dataset = (Dataset.from_tensor_slices(filenames)
.interleave(lambda x:
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 последовательных элементов каждого итератора, и потребляя следующий входной элемент каждый раз, когда достигает конца итератора.
Примечание: Порядок элементов, выдаваемых этой трансформацией, детерминирован, пока map_func является чистой функцией. Если map_func содержит какие-либо состоятельные операции, порядок доступа к этому состоянию не определён.
Аргументы
map_func
Функция, отображающая элемент набора данных на набор данных.
cycle_length
(Необязательно.) Количество входных элементов, которые будут обрабатываться параллельно. Если не указано, значение будет взято из количества доступных ядер процессора. Если аргумент num_parallel_calls установлен в tf.data.experimental.AUTOTUNE, аргумент cycle_length также определяет максимальную степень параллелизма.
block_length
(Необязательно.) Количество последовательных элементов, которые нужно получить из каждого входного элемента, прежде чем перейти к другому входному элементу.
num_parallel_calls
(Необязательно.) Если указано, реализация создаёт пул потоков, который используется для асинхронного и параллельного извлечения входных данных из циклических элементов. По умолчанию входные данные из циклических элементов извлекаются синхронно без параллелизма. Если используется значение tf.data.experimental.AUTOTUNE, то количество параллельных вызовов устанавливается динамически на основе доступных ядер процессора.
Набор данных всех файлов, соответствующих одному или нескольким шаблонам подстановки.
Примечание: По умолчанию этот метод возвращает имена файлов в случайном порядке, без определенного порядка. Передайте 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 типа строка (скаляр или вектор), представляющие шаблон(ы) подстановки имени файла (т.е. символ подстановки оболочки), которые будут сопоставлены.
shuffle
(Необязательно.) Если True, имена файлов будут случайно перемешаны. По умолчанию True.
seed
(Необязательно.) Скаляр tf.int64tf.Tensor, представляющий случайное семя, которое будет использовано для создания распределения. См. tf.compat.v1.set_random_seed для получения информации о поведении.
Создаёт Iterator для перечисления элементов этого набора данных. (устаревшая функция)
Примечание: Возвращаемый итератор будет в неинициализированном состоянии, и вы должны выполнить операцию iterator.initializer перед его использованием:
(Необязательно.) Если не пусто, возвращаемый итератор будет совместно использоваться под заданным именем в нескольких сессиях, которые используют одни и те же устройства (например, при использовании удалённого сервера).
Применяет отображение map_func к элементам этого набора данных.
Это преобразование применяет map_func к каждому элементу этого набора данных и возвращает новый набор данных, содержащий преобразованные элементы в том же порядке, что и во входном.
Подпись входного map_func определяется структурой каждого элемента в этом наборе данных. Например:
# NOTE: The following examples use `{ ... }` to represent the
# contents of a dataset.
# Each element is a `tf.Tensor` object.
a = { 1, 2, 3, 4, 5 }
# `map_func` takes a single argument of type `tf.Tensor` with the same
# shape and dtype.
result = a.map(lambda x: ...)
# Each element is a tuple containing two `tf.Tensor` objects.
b = { (1, "foo"), (2, "bar"), (3, "baz") }
# `map_func` takes two arguments of type `tf.Tensor`.
result = b.map(lambda x_int, y_str: ...)
# Each element is a dictionary mapping strings to `tf.Tensor` objects.
c = { {"a": 1, "b": "foo"}, {"a": 2, "b": "bar"}, {"a": 3, "b": "baz"} }
# `map_func` takes a single argument of type `dict` with the same keys as
# the elements.
result = c.map(lambda d: ...)
Значение или значения, возвращаемые map_func определяют структуру каждого элемента в возвращаемом наборе данных.
map_func может принимать в качестве аргументов и возвращать любые типы элементов набора данных.
Обратите внимание, что независимо от контекста, в котором определён map_func (eager или граф), tf.data отслеживает функцию и выполняет её как граф. Для использования Python-кода внутри функции у вас есть два варианта:
1) Положитесь на AutoGraph для преобразования Python-кода в эквивалентную вычисление графа. Недостатком этого подхода является то, что AutoGraph может преобразовать только часть, но не весь Python-код.
2) Используйте tf.py_function, который позволяет писать произвольный Python-код, но обычно приводит к худшей производительности, чем вариант 1). Например:
d = tf.data.Dataset.from_tensor_slices(['hello', 'world'])
# transform a string tensor to upper case string using a Python function
def upper_case_fn(t: tf.Tensor) -> str:
return t.numpy().decode('utf-8').upper()
d.map(lambda x: tf.py_function(func=upper_case_fn,
inp=[x], Tout=tf.string)) # ==> [ "HELLO", "WORLD" ]
Аргументы
map_func
Функция, отображающая элемент набора данных на другой элемент набора данных.
num_parallel_calls
(Необязательно.) Скаляр tf.int32tf.Tensor, представляющий количество элементов, которые нужно обрабатывать асинхронно параллельно. Если не указано, элементы будут обрабатываться последовательно. Если используется значение tf.data.experimental.AUTOTUNE, то количество параллельных вызовов устанавливается динамически на основе доступных ядер процессора.
Применяет отображение map_func к элементам этого набора данных. (устаревшая функция)
Примечание: Это аварийный выход для существующих применений map которые не работают с функциями V2. Новые применения решительно не рекомендуются, и существующие применения должны перейти на map, так как этот метод будет удалён в V2.
Аргументы
map_func
Функция, отображающая вложенную структуру тензоров (с формами и типами, определёнными self.output_shapes и self.output_types) на другую вложенную структуру тензоров.
num_parallel_calls
(Необязательно.) Скаляр tf.int32tf.Tensor, представляющий количество элементов, которые нужно обрабатывать асинхронно параллельно. Если не указано, элементы будут обрабатываться последовательно. Если используется значение tf.data.experimental.AUTOTUNE, то количество параллельных вызовов устанавливается динамически на основе доступных ядер процессора.
Объединяет последовательные элементы этого набора данных в заполненные пакеты.
Данное преобразование объединяет несколько последовательных элементов входного набора данных в один элемент.
Как и в случае с tf.data.Dataset.batch, компоненты результирующего элемента будут иметь дополнительное внешнее измерение, которое будет batch_size (или N % batch_size для последнего элемента, если batch_size не делит количество входных элементов N равномерно и drop_remainder равно False). Если ваша программа зависит от того, что пакеты имеют одинаковое внешнее измерение, вы должны установить аргумент drop_remainder в True, чтобы предотвратить создание меньшего пакета.
В отличие от tf.data.Dataset.batch, входные элементы для формирования пакета могут иметь разные формы, и это преобразование заполнит каждый компонент до соответствующей формы в padding_shapes. Аргумент padding_shapes определяет результирующую форму для каждого измерения каждого компонента в элементе выходного набора данных:
Если измерение является константой (например, tf.compat.v1.Dimension(37)), компонент будет заполнен до этой длины в этом измерении.
Если измерение неизвестно (например, tf.compat.v1.Dimension(None)), компонент будет заполнен до максимальной длины всех элементов в этом измерении.
Скалярное значение типа tf.int64tf.Tensor, представляющее количество последовательных элементов этого набора данных, которые нужно объединить в один пакет.
padded_shapes
Вложенная структура объектов типа tf.TensorShape или tf.int64 векторных тензоров, представляющих форму, до которой следует заполнить соответствующий компонент каждого входного элемента перед формированием пакета. Любые неизвестные измерения (например, tf.compat.v1.Dimension(None) в tf.TensorShape или -1 в тензорном объекте) будут заполнены до максимального размера этого измерения в каждом пакете.
padding_values
(Необязательно.) Вложенная структура скалярных tf.Tensor, представляющая значения заполнения для соответствующих компонентов. По умолчанию - 0 для числовых типов и пустая строка для строковых типов.
drop_remainder
(Необязательно.) Скалярное значение типа tf.booltf.Tensor, представляющее, следует ли пропускать последний пакет в случае, если он содержит меньше, чем batch_size элементов; поведение по умолчанию - не пропускать меньший пакет.
Создает набор данных Dataset, который предварительно извлекает элементы из этого набора данных.
Примечание: Как и другие методы Dataset, prefetch работает с элементами входного набора данных. У него нет понятия «примеры против пакетов». examples.prefetch(2) предварительно извлечёт два элемента (2 примера), тогда как examples.batch(20).prefetch(2) предварительно извлечёт 2 элемента (2 пакета по 20 примеров каждый).
Аргументы
buffer_size
Скалярное значение типа tf.int64tf.Tensor, представляющее максимальное количество элементов, которые будут буферизованы при предварительном извлечении.
Преобразование последовательно применяет функцию reduce_func к каждому элементу входного набора данных до тех пор, пока набор данных не будет исчерпан, агрегируя информацию в своем внутреннем состоянии. Аргумент initial_state используется для начального состояния, а конечное состояние возвращается в качестве результата.
Например:
tf.data.Dataset.range(5).reduce(np.int64(0), lambda x, _: x + 1) производит 5
tf.data.Dataset.range(5).reduce(np.int64(0), lambda x, y: x + y) производит 10
Аргументы
initial_state
Элемент, представляющий начальное состояние преобразования.
reduce_func
Функция, которая отображает (old_state, input_element) в new_state. Она должна принимать два аргумента и возвращать новый элемент. Структура new_state должна соответствовать структуре initial_state.
Возвращаемое значение
Элемент набора данных, соответствующий конечному состоянию преобразования.
Примечание: Если этот набор данных зависит от глобального состояния (например, генератора случайных чисел), разные повторения могут создавать разные элементы.
Аргументы
count
(Необязательно.) Скалярное значение типа tf.int64tf.Tensor, представляющее количество раз, которое набор данных должен быть повторён. По умолчанию (если count равно None или -1 ) набор данных будет повторяться бесконечно.
Создаёт набор данных Dataset, включающий только 1/num_shards этого набора данных.
Этот оператор набора данных очень полезен при распределённом обучении, так как он позволяет каждому узлу читать уникальный подмножество.
При чтении одного входного файла можно пропускать элементы следующим образом:
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)
Важные замечания:
Убедитесь, что вы используете оператор shard перед любым оператором случайного выбора (например, shuffle).
В общем случае лучше использовать оператор shard в начале конвейера набора данных. Например, при чтении из набора файлов TFRecord shard перед преобразованием набора данных в входные примеры. Это предотвращает чтение каждого файла на каждом узле. Ниже приведён пример эффективной стратегии фрагментации в полном конвейере:
d = Dataset.list_files(pattern)
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.int64tf.Tensor, представляющее количество фрагментов, работающих параллельно.
index
Скалярное значение типа tf.int64tf.Tensor, представляющее индекс узла.
Возвращаемое значение
Dataset
Набор данных Dataset.
Возбуждает
InvalidArgumentError
если num_shards или index являются недопустимыми значениями. Примечание: проверка ошибок выполняется с наилучшими усилиями, и ошибки не гарантируется, что они будут пойманы при создании набора данных. (например, предоставление в заполнителе тензора обходит раннюю проверку и вместо этого приведет к ошибке во время вызова session.run.)
Случайно перемешивает элементы этого набора данных.
Этот набор данных заполняет буфер buffer_size элементами, затем случайным образом выбирает элементы из этого буфера, заменяя выбранные элементы новыми элементами. Для идеального перемешивания требуется размер буфера, большего или равного полному размеру набора данных.
Например, если ваш набор данных содержит 10 000 элементов, но buffer_size установлено в 1000, то shuffle изначально выберет случайный элемент только из первых 1000 элементов в буфере. После выбора элемента его место в буфере заменяется следующим (т. е. 1001-м) элементом, сохраняя буфер размером 1000 элементов.
Аргументы
buffer_size
Скаляр tf.int64tf.Tensor, представляющий количество элементов из этого набора данных, из которых новый набор данных будет выбирать.
(Необязательно.) Логическое значение, которое, если истинно, указывает, что набор данных должен быть псевдослучайным образом перемешан каждый раз при итерации по нему. (По умолчанию True.)
Создает Dataset, пропускающий count элементов из этого набора данных.
Аргументы
count
Скаляр tf.int64tf.Tensor, представляющий количество элементов этого набора данных, которые следует пропустить для формирования нового набора данных. Если count больше размера этого набора данных, новый набор данных не будет содержать элементов. Если count равно -1, пропускается весь набор данных.
Создает Dataset с максимальным количеством count элементов из этого набора данных.
Аргументы
count
Скаляр tf.int64tf.Tensor, представляющий количество элементов этого набора данных, которые следует взять для формирования нового набора данных. Если count равно -1, или если count больше размера этого набора данных, новый набор данных будет содержать все элементы этого набора данных.
Разделяет элементы набора данных на несколько элементов.
Например, если элементы набора данных имеют форму [B, a0, a1, ...], где B может меняться для каждого входного элемента, то для каждого элемента в наборе данных набор данных без группирования будет содержать B последовательных элементов формы [a0, a1, ...].
# NOTE: The following example uses `{ ... }` to represent the contents
# of a dataset.
ds = { ['a', 'b', 'c'], ['a', 'b'], ['a', 'b', 'c', 'd'] }
ds.unbatch() == {'a', 'b', 'c', 'a', 'b', 'a', 'b', 'c', 'd'}
Объединяет (вложенные) входные элементы в набор данных (вложенных) окон.
«Окно» — это конечный набор данных плоских элементов размером size (или, возможно, меньше, если для заполнения окна не хватает входных элементов и drop_remainder принимает значение false).
Аргумент stride определяет шаг входных элементов, а аргумент shift определяет сдвиг окна.
Например, пусть {...} представляет собой набор данных:
Параметры «глобальные» в том смысле, что они применяются ко всему набору данных. Если параметры заданы несколько раз, они объединяются, если разные параметры не используют разные значения, отличные от значений по умолчанию.
Создаёт Dataset путём объединения заданных наборов данных.
Этот метод имеет аналогичную семантику встроенной функции zip() в Python, основное отличие заключается в том, что аргумент datasets может быть произвольной вложенной структурой объектов Dataset. Например:
a = Dataset.range(1, 4) # ==> [ 1, 2, 3 ]
b = Dataset.range(4, 7) # ==> [ 4, 5, 6 ]
c = Dataset.range(7, 13).batch(2) # ==> [ [7, 8], [9, 10], [11, 12] ]
d = Dataset.range(13, 15) # ==> [ 13, 14 ]
# The nested structure of the `datasets` argument determines the
# structure of elements in the resulting dataset.
Dataset.zip((a, b)) # ==> [ (1, 4), (2, 5), (3, 6) ]
Dataset.zip((b, a)) # ==> [ (4, 1), (5, 2), (6, 3) ]
# The `datasets` argument may contain an arbitrary number of
# datasets.
Dataset.zip((a, b, c)) # ==> [ (1, 4, [7, 8]),
# (2, 5, [9, 10]),
# (3, 6, [11, 12]) ]
# The number of elements in the resulting dataset is the same as
# the size of the smallest dataset in `datasets`.
Dataset.zip((a, d)) # ==> [ (1, 13), (2, 14) ]