tf.contrib.data.RandomDataset
A Dataset of pseudorandom values.
Inherits From: RandomDataset
tf.contrib.data.RandomDataset(
seed=None
)
| Attributes | |
|---|---|
element_spec | The type specification of an element of this dataset. |
output_classes | Returns the class of each component of an element of this dataset. (deprecated) |
output_shapes | Returns the shape of each component of an element of this dataset. (deprecated) |
output_types | Returns the type of each component of an element of this dataset. (deprecated) |
Methods
apply
apply(
transformation_func
)
Applies a transformation function to this dataset.
apply enables chaining of custom Dataset transformations, which are represented as functions that take one Dataset argument and return a transformed Dataset.
For example:
dataset = (dataset.map(lambda x: x ** 2)
.apply(group_by_window(key_func, reduce_func, window_size))
.map(lambda x: x ** 3))
| Args | |
|---|---|
transformation_func | A function that takes one Dataset argument and returns a Dataset. |
| Returns | |
|---|---|
Dataset | The Dataset returned by applying transformation_func to this dataset. |
batch
batch(
batch_size, drop_remainder=False
)
Combines consecutive elements of this dataset into batches.
The components of the resulting element will have an additional outer dimension, which will be batch_size (or N % batch_size for the last element if batch_size does not divide the number of input elements N evenly and drop_remainder is False). If your program depends on the batches having the same outer dimension, you should set the drop_remainder argument to True to prevent the smaller batch from being produced.
| Args | |
|---|---|
batch_size | A tf.int64 scalar tf.Tensor, representing the number of consecutive elements of this dataset to combine in a single batch. |
drop_remainder | (Optional.) A tf.bool scalar tf.Tensor, representing whether the last batch should be dropped in the case it has fewer than batch_size elements; the default behavior is not to drop the smaller batch. |
| Returns | |
|---|---|
Dataset | A Dataset. |
cache
cache(
filename=''
)
Caches the elements in this dataset.
| Args | |
|---|---|
filename | A tf.string scalar tf.Tensor, representing the name of a directory on the filesystem to use for caching elements in this Dataset. If a filename is not provided, the dataset will be cached in memory. |
| Returns | |
|---|---|
Dataset | A Dataset. |
concatenate
concatenate(
dataset
)
Creates a Dataset by concatenating the given dataset with this 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 ]
| Args | |
|---|---|
dataset | Dataset to be concatenated. |
| Returns | |
|---|---|
Dataset | A Dataset. |
enumerate
enumerate(
start=0
)
Enumerates the elements of this dataset.
It is similar to python's enumerate.
For example:
# 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)) }
| Args | |
|---|---|
start | A tf.int64 scalar tf.Tensor, representing the start value for enumeration. |
| Returns | |
|---|---|
Dataset | A Dataset. |
filter
filter(
predicate
)
Filters this dataset according to predicate.
d = tf.data.Dataset.from_tensor_slices([1, 2, 3]) d = d.filter(lambda x: x < 3) # ==> [1, 2] # `tf.math.equal(x, y)` is required for equality comparison def filter_fn(x): return tf.math.equal(x, 1) d = d.filter(filter_fn) # ==> [1]
| Args | |
|---|---|
predicate | A function mapping a dataset element to a boolean. |
| Returns | |
|---|---|
Dataset | The Dataset containing the elements of this dataset for which predicate is True. |
filter_with_legacy_function
filter_with_legacy_function(
predicate
)
Filters this dataset according to predicate. (deprecated)
Note: This is an escape hatch for existing uses offilterthat do not work with V2 functions. New uses are strongly discouraged and existing uses should migrate tofilteras this method will be removed in V2.
| Args | |
|---|---|
predicate | A function mapping a nested structure of tensors (having shapes and types defined by self.output_shapes and self.output_types) to a scalar tf.bool tensor. |
| Returns | |
|---|---|
Dataset | The Dataset containing the elements of this dataset for which predicate is True. |
flat_map
flat_map(
map_func
)
Maps map_func across this dataset and flattens the result.
Use flat_map if you want to make sure that the order of your dataset stays the same. For example, to flatten a dataset of batches into a dataset of their elements:
a = Dataset.from_tensor_slices([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) a.flat_map(lambda x: Dataset.from_tensor_slices(x + 1)) # ==> # [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
tf.data.Dataset.interleave() is a generalization of flat_map, since flat_map produces the same output as tf.data.Dataset.interleave(cycle_length=1)
| Args | |
|---|---|
map_func | A function mapping a dataset element to a dataset. |
| Returns | |
|---|---|
Dataset | A Dataset. |
from_generator
@staticmethod
from_generator(
generator, output_types, output_shapes=None, args=None
)
Creates a Dataset whose elements are generated by 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 | Объект Dataset. |
from_sparse_tensor_slices
@staticmethod
from_sparse_tensor_slices(
sparse_tensor
)
Разделяет каждый тензор ранга N tf.SparseTensor в этой строке набора данных по строкам. (Устарело)
| Аргументы | |
|---|---|
sparse_tensor | tf.SparseTensor. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset ранга (N-1) разреженных тензоров. |
from_tensor_slices
@staticmethod
from_tensor_slices(
tensors
)
Создаёт набор данных Dataset, элементы которого являются срезами заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, и выполнение в режиме eager отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к потере памяти и ограничениям по размеру при сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативный вариант, описанный в этом руководстве.
| Аргументы | |
|---|---|
tensors | Элемент набора данных, где каждый компонент имеет одинаковый размер в 0-м измерении. |
| Возвращаемое значение | |
|---|---|
Dataset | Набор данных Dataset. |
from_tensors
@staticmethod
from_tensors(
tensors
)
Создаёт набор данных Dataset с единственным элементом, состоящим из заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, и выполнение в режиме eager отключено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к потере памяти и ограничениям по размеру при сериализации графа. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативный вариант, описанный в этом руководстве.
| Аргументы | |
|---|---|
tensors | Элемент набора данных. |
| Возвращаемое значение | |
|---|---|
Dataset | Набор данных Dataset. |
interleave
interleave(
map_func, cycle_length=AUTOTUNE, block_length=1, num_parallel_calls=None
)
Применяет 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 последовательных элементов из каждого итератора и потребляя следующий входной элемент каждый раз, когда достигает конца итератора.
Например:
a = Dataset.range(1, 6) # ==> [ 1, 2, 3, 4, 5 ]
# NOTE: New lines indicate "block" boundaries.
a.interleave(lambda x: Dataset.from_tensors(x).repeat(6),
cycle_length=2, block_length=4) # ==> [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является чистой функцией. Еслиmap_funcсодержит какие-либо операции с состоянием, порядок доступа к этому состоянию не определен.
| Аргументы | |
|---|---|
map_func | Функция, отображающая элемент набора данных на набор данных. |
cycle_length | (Необязательно.) Количество входных элементов, которые будут обрабатываться параллельно. Если не указано, значение будет получено из количества доступных ядер процессора. Если аргумент num_parallel_calls установлен на tf.data.experimental.AUTOTUNE, аргумент cycle_length также определяет максимальную степень параллелизма. |
block_length | (Необязательно.) Количество последовательных элементов, которые нужно сгенерировать от каждого входного элемента, прежде чем перейти к другому входному элементу. |
num_parallel_calls | (Необязательно.) Если указано, реализация создаёт пул потоков, который используется для асинхронного и параллельного извлечения входных данных из циклических элементов. По умолчанию поведение заключается в синхронном извлечении входных данных из циклических элементов без параллелизма. Если используется значение tf.data.experimental.AUTOTUNE, количество параллельных вызовов устанавливается динамически на основе доступных ядер процессора. |
| Возвращаемое значение | |
|---|---|
Dataset | Набор данных Dataset. |
list_files
@staticmethod
list_files(
file_pattern, shuffle=None, seed=None
)
Набор данных со всеми файлами, соответствующими одному или нескольким шаблонам поиска.
Примечание: По умолчанию этот метод возвращает имена файлов в не детерминированном случайном перемешанном порядке. Передайте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.int64 tf.Tensor, представляющий случайное семя, которое будет использовано для создания распределения. См. tf.compat.v1.set_random_seed для поведения. |
| Возвращаемое значение | |
|---|---|
Dataset | Список строк, соответствующих именам файлов. |
make_initializable_iterator
make_initializable_iterator(
shared_name=None
)
Создаёт итератор для перечисления элементов этого набора данных. (устарело)
Примечание: Возвращаемый итератор будет в неинициализированном состоянии, и вы должны выполнить операцию iterator.initializer перед его использованием:
dataset = ... iterator = dataset.make_initializable_iterator() # ... sess.run(iterator.initializer)
| Аргументы | |
|---|---|
shared_name | (Необязательно.) Если не пусто, возвращаемый итератор будет совместно использоваться под указанным именем в нескольких сессиях, которые используют одни и те же устройства (например, при использовании удаленного сервера). |
| Возвращаемое значение | |
|---|---|
| Итератор по элементам этого набора данных. |
| Исключения | |
|---|---|
RuntimeError | Если включено выполнение Eager. |
make_one_shot_iterator
make_one_shot_iterator()
Создаёт итератор для перечисления элементов этого набора данных. (устарело)
Примечание: Возвращаемый итератор будет инициализирован автоматически. Итератор "one-shot" в настоящее время не поддерживает повторную инициализацию.
| Возвращаемое значение | |
|---|---|
| Итератор по элементам этого набора данных. |
map
map(
map_func, num_parallel_calls=None
)
Применяет функцию `map` к элементам этого набора данных.
Это преобразование применяет функцию `map` к каждому элементу этого набора данных и возвращает новый набор данных, содержащий преобразованные элементы в том же порядке, что и в исходном.
Например:
a = Dataset.range(1, 6) # ==> [ 1, 2, 3, 4, 5 ] a.map(lambda x: x + 1) # ==> [ 2, 3, 4, 5, 6 ]
Подпись ввода функции `map` определяется структурой каждого элемента в этом наборе данных. Например:
# 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`, определяют структуру каждого элемента в возвращаемом наборе данных.
# `map_func` returns a scalar `tf.Tensor` of type `tf.float32`.
def f(...):
return tf.constant(37.0)
result = dataset.map(f)
result.output_classes == tf.Tensor
result.output_types == tf.float32
result.output_shapes == [] # scalar
# `map_func` returns two `tf.Tensor` objects.
def g(...):
return tf.constant(37.0), tf.constant(["Foo", "Bar", "Baz"])
result = dataset.map(g)
result.output_classes == (tf.Tensor, tf.Tensor)
result.output_types == (tf.float32, tf.string)
result.output_shapes == ([], [3])
# Python primitives, lists, and NumPy arrays are implicitly converted to
# `tf.Tensor`.
def h(...):
return 37.0, ["Foo", "Bar", "Baz"], np.array([1.0, 2.0] dtype=np.float64)
result = dataset.map(h)
result.output_classes == (tf.Tensor, tf.Tensor, tf.Tensor)
result.output_types == (tf.float32, tf.string, tf.float64)
result.output_shapes == ([], [3], [2])
# `map_func` can return nested structures.
def i(...):
return {"a": 37.0, "b": [42, 16]}, "foo"
result.output_classes == ({"a": tf.Tensor, "b": tf.Tensor}, tf.Tensor)
result.output_types == ({"a": tf.float32, "b": tf.int32}, tf.string)
result.output_shapes == ({"a": [], "b": [2]}, [])
Функция `map` может принимать в качестве аргументов и возвращать любой тип элемента набора данных.
Обратите внимание, что независимо от контекста, в котором определена функция `map` (eager или graph), 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.int32 tf.Tensor, представляющий количество элементов, которые будут обрабатываться асинхронно параллельно. Если не указано, элементы будут обрабатываться последовательно. Если используется значение tf.data.experimental.AUTOTUNE, то количество параллельных вызовов устанавливается динамически на основе доступных ресурсов CPU. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект набора данных. |
map_with_legacy_function
map_with_legacy_function(
map_func, num_parallel_calls=None
)
Применяет функцию `map` к элементам этого набора данных. (устарело)
Примечание: Это утилита для существующего использования функций `map`, которые не работают с V2 функциями. Новые использования настоятельно не рекомендуется, и существующие должны мигрировать на map, так как этот метод будет удален в V2.
| Аргументы | |
|---|---|
map_func | Функция, отображающая вложенную структуру тензоров (с формами и типами, определёнными self.output_shapes и self.output_types) на другую вложенную структуру тензоров. |
num_parallel_calls | (Необязательно.) Скалярный tf.int32 tf.Tensor, представляющий количество элементов, которые будут обрабатываться асинхронно параллельно. Если не указано, элементы будут обрабатываться последовательно. Если используется значение tf.data.experimental.AUTOTUNE, то количество параллельных вызовов устанавливается динамически на основе доступных ресурсов CPU. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект набора данных. |
options
options()
Возвращает параметры этого набора данных и его входных данных.
| Возвращаемое значение | |
|---|---|
Объект tf.data.Options, представляющий параметры набора данных. |
padded_batch
padded_batch(
batch_size, padded_shapes, padding_values=None, drop_remainder=False
)
Объединяет последовательные элементы этого набора данных в заполненные пакеты.
Это преобразование объединяет несколько последовательных элементов входного набора данных в один элемент.
Как и 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.data.experimental.dense_to_sparse_batch, который объединяет элементы с различными формами в tf.SparseTensor.
| Args | |
|---|---|
batch_size | A tf.int64 скаляр tf.Tensor, представляющий количество последовательных элементов этого набора данных, которые необходимо объединить в одну партию. |
padded_shapes | Вложенная структура tf.TensorShape или tf.int64 векторных тензорных объектов, представляющих форму, к которой соответствующая компонента каждого элемента ввода должна быть дополнена перед объединением в пакет. Любые неизвестные размеры (например, tf.compat.v1.Dimension(None) в tf.TensorShape или -1 в тензорном объекте) будут дополнены до максимального размера этого измерения в каждой партии. |
padding_values | (Необязательно.) Вложенная структура скалярных tf.Tensor, представляющая значения заполнения для соответствующих компонентов. По умолчанию — 0 для числовых типов и пустая строка для строковых типов. |
drop_remainder | (Необязательно.) A tf.bool скаляр tf.Tensor, представляющий, следует ли опускать последнюю партию в случае, если она содержит меньше, чем batch_size элементов; по умолчанию меньшая партия не опускается. |
| Returns | |
|---|---|
Dataset | A Dataset. |
prefetch
prefetch(
buffer_size
)
Создаёт набор данных, который предварительно загружает элементы из этого набора данных.
Примечание: Как и другие методыDataset, prefetch работает с элементами входного набора данных. Он не понимает понятия примеры против партий.examples.prefetch(2)будет предварительно загружать два элемента (2 примера), в то время какexamples.batch(20).prefetch(2)будет предварительно загружать 2 элемента (2 партии по 20 примеров каждая).
| Args | |
|---|---|
buffer_size | A tf.int64 скаляр tf.Tensor, представляющий максимальное количество элементов, которые будут буферизованы при предварительной загрузке. |
| Returns | |
|---|---|
Dataset | A Dataset. |
range
@staticmethod
range(
*args
)
Создаёт набор данных из последовательности значений с заданным шагом.
Например:
Dataset.range(5) == [0, 1, 2, 3, 4] Dataset.range(2, 5) == [2, 3, 4] Dataset.range(1, 5, 2) == [1, 3] Dataset.range(1, 5, -2) == [] Dataset.range(5, 1) == [] Dataset.range(5, 1, -2) == [5, 3]
| Args | |
|---|---|
*args | соответствует семантике python's xrange. 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, stop = args[2] |
| Returns | |
|---|---|
Dataset | A RangeDataset. |
| Raises | |
|---|---|
ValueError | если len(args) == 0. |
reduce
reduce(
initial_state, reduce_func
)
Сводит входной набор данных к одному элементу.
Преобразование вызывает 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
| Args | |
|---|---|
initial_state | Элемент, представляющий начальное состояние преобразования. |
reduce_func | Функция, которая отображает (old_state, input_element) на new_state. Она должна принимать два аргумента и возвращать новый элемент. Структура new_state должна соответствовать структуре initial_state. |
| Returns | |
|---|---|
| Элемент набора данных, соответствующий конечному состоянию преобразования. |
repeat
repeat(
count=None
)
Повторяет этот набор данных count раз.
Примечание: Если этот набор данных зависит от глобального состояния (например, генератора случайных чисел), то разные повторения могут давать разные элементы.
| Args | |
|---|---|
count | (Необязательно.) A tf.int64 скаляр tf.Tensor, представляющий количество повторений набора данных. По умолчанию (если count равно None или -1) набор данных повторяется бесконечно. |
| Returns | |
|---|---|
Dataset | A Dataset. |
shard
shard(
num_shards, index
)
Создаёт набор данных, содержащий только 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)
Важные замечания:
- Убедитесь, что вы разделили набор данных до применения любого оператора случайной выборки (например, shuffle).
- В целом лучше использовать оператор разбиения на части на ранней стадии конвейера набора данных. Например, при чтении из набора файлов TFRecord разделите набор данных на части перед преобразованием набора данных в входные образцы. Это предотвращает чтение каждого файла на каждом рабочем узле. Ниже приведён пример эффективной стратегии разбиения на части внутри полного конвейера:
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)
| Args | |
|---|---|
num_shards | A tf.int64 скаляр tf.Tensor, представляющий количество фрагментов, работающих параллельно. |
index | A tf.int64 скаляр tf.Tensor, представляющий индекс рабочего узла. |
| Returns | |
|---|---|
Dataset | A Dataset. |
| Raises | |
|---|---|
InvalidArgumentError | если num_shards или index имеют недопустимые значения. Примечание: проверка ошибок выполняется на основе наилучших возможностей, и ошибки не гарантируются при создании набора данных. (например, предоставление в качестве аргумента подстановки тензора обходит раннюю проверку, и вместо этого вызовет ошибку при вызове session.run.) |
shuffle
shuffle(
buffer_size, seed=None, reshuffle_each_iteration=None
)
Случайным образом перемешивает элементы этого набора данных.
Этот набор данных заполняет буфер элементами buffer_size, затем случайным образом выбирает элементы из этого буфера, заменяя выбранные элементы новыми элементами. Для идеального перемешивания требуется размер буфера, равный или больший, чем полная размер набора данных.
Например, если ваш набор данных содержит 10 000 элементов, но buffer_size задан как 1000, тогда shuffle изначально выберет случайный элемент только из первых 1000 элементов в буфере. После выбора элемента его место в буфере заменяется следующим (т. е. 1001-м) элементом, поддерживая буфер из 1000 элементов.
| Аргументы | |
|---|---|
buffer_size | Скалярное значение типа tf.int64 tf.Tensor, представляющее количество элементов из этого набора данных, из которых новый набор данных будет производить выборку. |
seed | (Необязательно.) Скалярное значение типа tf.int64 tf.Tensor, представляющее случайное семя, которое будет использоваться для создания распределения. См. tf.compat.v1.set_random_seed для получения информации о поведении. |
reshuffle_each_iteration | (Необязательно.) Булево значение, которое, если равно true, указывает, что набор данных должен быть псевдослучайным образом перемешивается каждый раз при итерации по нему. (По умолчанию True.) |
| Возвращаемое значение | |
|---|---|
Dataset | Dataset. |
skip
skip(
count
)
Создаёт набор данных, пропускающий count элементов из этого набора данных.
| Аргументы | |
|---|---|
count | Скалярное значение типа tf.int64 tf.Tensor, представляющее количество элементов из этого набора данных, которые должны быть пропущены для создания нового набора данных. Если count больше размера этого набора данных, новый набор данных не будет содержать элементов. Если count равно -1, пропускает весь набор данных. |
| Возвращаемое значение | |
|---|---|
Dataset | Dataset. |
take
take(
count
)
Создаёт набор данных, содержащий не более count элементов из этого набора данных.
| Аргументы | |
|---|---|
count | Скалярное значение типа tf.int64 tf.Tensor, представляющее количество элементов из этого набора данных, которые должны быть взяты для создания нового набора данных. Если count равно -1, или если count больше размера этого набора данных, новый набор данных будет содержать все элементы этого набора данных. |
| Возвращаемое значение | |
|---|---|
Dataset | Dataset. |
unbatch
unbatch()
Разделяет элементы набора данных на несколько элементов.
Например, если элементы набора данных имеют форму [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'}
| Возвращаемое значение | |
|---|---|
Функция преобразования набора данных, которая может быть передана в tf.data.Dataset.apply. |
window
window(
size, shift=None, stride=1, drop_remainder=False
)
Объединяет входные элементы (или вложенные элементы) в набор данных из окон.
«Окно» — это конечный набор данных плоских элементов размером size (или, возможно, меньше, если входных элементов недостаточно для заполнения окна и drop_remainder имеет значение false).
Аргумент stride определяет шаг входных элементов, а аргумент shift определяет сдвиг окна.
Например, используя {...} для представления набора данных:
-
tf.data.Dataset.range(7).window(2)даёт{ {0, 1}, {2, 3}, {4, 5}, {6} } -
tf.data.Dataset.range(7).window(3, 2, 1, True)даёт{ {0, 1, 2}, {2, 3, 4}, {4, 5, 6} } -
tf.data.Dataset.range(7).window(3, 1, 2, True)даёт{ {0, 2, 4}, {1, 3, 5}, {2, 4, 6} }
Обратите внимание, что при применении преобразования window к набору данных вложенных элементов оно создаёт набор данных вложенных окон.
Например:
-
tf.data.Dataset.from_tensor_slices((range(4), range(4))).window(2)даёт{({0, 1}, {0, 1}), ({2, 3}, {2, 3})} -
tf.data.Dataset.from_tensor_slices({"a": range(4)}).window(2)даёт{ {"a": {0, 1} }, {"a": {2, 3} } }
| Аргументы | |
|---|---|
size | Скалярное значение типа tf.int64 tf.Tensor, представляющее количество элементов входного набора данных, объединяемых в окно. |
shift | (Необязательно.) Скалярное значение типа tf.int64 tf.Tensor, представляющее сдвиг скользящего окна на каждой итерации. По умолчанию size. |
stride | (Необязательно.) Скалярное значение типа tf.int64 tf.Tensor, представляющее шаг входных элементов в скользящем окне. |
drop_remainder | (Необязательно.) Скалярное значение типа tf.bool tf.Tensor, представляющее, следует ли отбрасывать окно, если его размер меньше window_size. |
| Возвращаемое значение | |
|---|---|
Dataset | Набор данных (или вложенных наборов данных) окон — конечные наборы данных плоских элементов, созданных из (вложенных) входных элементов. |
with_options
with_options(
options
)
Возвращает новый tf.data.Dataset с заданными параметрами.
Параметры «глобальные» в том смысле, что они применяются ко всему набору данных. Если параметры задаются несколько раз, они объединяются, если разные параметры не используют разные значения, отличные от значений по умолчанию.
| Аргументы | |
|---|---|
options | tf.data.Options, определяющий параметры для использования. |
| Возвращаемое значение | |
|---|---|
Dataset | Dataset с заданными параметрами. |
| Исключения | |
|---|---|
ValueError | при установке параметра более одного раза с ненулевым значением |
zip
@staticmethod
zip(
datasets
)
Создаёт набор данных путём объединения указанных наборов данных.
Этот метод имеет похожие семантику с встроенной функцией 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) ]
| Аргументы | |
|---|---|
datasets | Вложенная структура наборов данных. |
| Возвращаемое значение | |
|---|---|
Dataset | Dataset. |
__iter__
__iter__()
Создаёт итератор для перечисления элементов этого набора данных.
Возвращаемый итератор реализует протокол Python-итератора и поэтому может быть использован только в режиме eager.
| Возвращаемое значение | |
|---|---|
| Итератор по элементам этого набора данных. |
| Исключения | |
|---|---|
RuntimeError | Если не внутри tf.function и не в режиме eager. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/data/RandomDataset