tf.compat.v2.data.Dataset
Представляет потенциально большой набор элементов.
Наследуется от: CheckpointableBase
tf.compat.v2.data.Dataset(
variant_tensor
)
Объект Dataset может использоваться для представления входного конвейера как коллекции элементов и «логического плана» преобразований, которые действуют на эти элементы.
Набор данных содержит элементы, каждый из которых имеет одинаковую (вложенную) структуру, и отдельные компоненты структуры могут быть любого типа, представимого tf.TypeSpec, включая tf.Tensor, tf.data.Dataset, tf.SparseTensor, tf.RaggedTensor или tf.TensorArray.
Примеры элементов:
# Integer element
a = 1
# Float element
b = 2.0
# Tuple element with 2 components
c = (1, 2)
# Dict element with 3 components
d = {"a": (2, 2), "b": 3}
# Element containing a dataset
e = tf.data.Dataset.from_element(10)
| Аргументы | |
|---|---|
variant_tensor | Тензор DT_VARIANT, представляющий набор данных. |
| Атрибуты | |
|---|---|
element_spec | Спецификация типа элемента этого набора данных. |
Методы
apply
apply(
transformation_func
)
Применяет функцию преобразования к этому набору данных.
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
batch(
batch_size, drop_remainder=False
)
Объединяет последовательные элементы этого набора данных в пакеты.
Компоненты результирующего элемента будут иметь дополнительное внешнее измерение, которое будет batch_size (или N % batch_size для последнего элемента, если batch_size не делит число входных элементов N равномерно и drop_remainder равно False). Если ваша программа зависит от того, что пакеты имеют одинаковое внешнее измерение, вы должны установить аргумент drop_remainder в True для предотвращения создания меньшего пакета.
| Аргументы | |
|---|---|
batch_size | Скалярный tf.int64 tf.Tensor, представляющий количество последовательных элементов этого набора данных, которые необходимо объединить в один пакет. |
drop_remainder | (Необязательно.) Скалярный tf.bool tf.Tensor, представляющий собой то, нужно ли отбросить последний пакет в случае, если в нем меньше batch_size элементов; по умолчанию меньший пакет не отбрасывается. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset . |
cache
cache(
filename=''
)
Кэширует элементы в этом наборе данных.
| Аргументы | |
|---|---|
filename | Скалярный tf.string tf.Tensor, представляющий имя каталога в файловой системе, используемом для кеширования элементов в этом наборе данных. Если имя файла не указано, набор данных будет кэширован в памяти. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset . |
concatenate
concatenate(
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 ]
| Аргументы | |
|---|---|
dataset | Dataset для конкатенации. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset . |
enumerate
enumerate(
start=0
)
Пронумерует элементы этого набора данных.
Аналогично enumerate в Python.
Например:
# 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.int64 tf.Tensor, представляющий начальное значение для нумерации. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset . |
filter
filter(
predicate
)
Фильтрует этот набор данных в соответствии с 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]
| Аргументы | |
|---|---|
predicate | Функция, отображающая элемент набора данных на булево значение. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset , содержащий элементы этого набора данных, для которых predicate равно True . |
flat_map
flat_map(
map_func
)
Применяет map_func к этому набору данных и сплющивает результат.
Используйте flat_map , если хотите убедиться, что порядок вашего набора данных останется неизменным. Например, чтобы сплющить набор данных из пакетов в набор данных из их элементов:
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() является обобщением flat_map, так как flat_map производит тот же результат, что и tf.data.Dataset.interleave(cycle_length=1).
| Аргументы | |
|---|---|
map_func | Функция, отображающая элемент набора данных на набор данных. |
| Возвращаемое значение | |
|---|---|
Dataset | Объект Dataset . |
from_generator
@staticmethod
from_generator(
generator, output_types, output_shapes=None, args=None
)
Создает набор данных, элементы которого генерируются 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_tensor_slices
@staticmethod
from_tensor_slices(
tensors
)
Создаёт Dataset, элементы которого являются срезами заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, а жадное выполнение не включено, значения будут встроены в граф как одна или несколько операций tf.constant. Для больших наборов данных (> 1 ГБ) это может привести к потере памяти и ограничениям размера графа сериализации. Если tensors содержит один или несколько больших массивов NumPy, рассмотрите альтернативу, описанную в данном руководстве.
| Аргументы | |
|---|---|
tensors | Элемент набора данных, где каждый компонент имеет одинаковый размер в 0-й размерности. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект Dataset. |
from_tensors
@staticmethod
from_tensors(
tensors
)
Создаёт Dataset с одним элементом, состоящим из заданных тензоров.
Обратите внимание, что если tensors содержит массив NumPy, а жадное выполнение не включено, значения будут встроены в граф как одна или несколько операций 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
)
Набор данных всех файлов, соответствующих одному или нескольким шаблонам glob.
Примечание: По умолчанию этот метод возвращает имена файлов в случайном, не детерминированном, порядке. Передайте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 | Строка, список строк или тензор типа string (скалярный или векторный), представляющий шаблон(ы) glob-имени файла (т.е. шаблон с подстановкой символов). |
shuffle | (Необязательно.) Если True, имена файлов будут случайным образом перемешаны. По умолчанию True. |
seed | (Необязательно.) Скалярный тензор tf.int64 типа, представляющий случайное семя, которое будет использовано для создания распределения. См. tf.compat.v1.set_random_seed для поведения. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект Dataset строк, соответствующих именам файлов. |
map
map(
map_func, num_parallel_calls=None
)
Применяет map_func к элементам этого набора данных.
Эта трансформация применяет map_func к каждому элементу этого набора данных и возвращает новый набор данных, содержащий преобразованные элементы в том же порядке, что и в исходном.
Пример:
a = Dataset.range(1, 6) # ==> [ 1, 2, 3, 4, 5 ] a.map(lambda x: x + 1) # ==> [ 2, 3, 4, 5, 6 ]
Подпись входного элемента 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` 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_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) -> 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, то количество параллельных вызовов устанавливается динамически на основе доступного процессора. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект 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.
| Аргументы | |
|---|---|
batch_size | Скалярный 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 | (Необязательно.) Скалярный tf.bool tf.Tensor, представляющий, следует ли отбрасывать последний пакет в случае, если он содержит меньше, чем batch_size элементов; по умолчанию меньший пакет не отбрасывается. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект Dataset. |
prefetch
prefetch(
buffer_size
)
Создаёт Dataset для предварительной выборки элементов из этого набора данных.
Примечание: Как и другие методыDataset, prefetch работает с элементами входного набора данных. Он не учитывает примеры против пакетов.examples.prefetch(2)будет предварительно выбирать два элемента (2 примера), аexamples.batch(20).prefetch(2)будет предварительно выбирать 2 элемента (2 пакета по 20 примеров каждый).
| Аргументы | |
|---|---|
buffer_size | Скалярный tf.int64 tf.Tensor, представляющий максимальное количество элементов, которые будут буферизованы при предварительной выборке. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект Dataset. |
range
@staticmethod
range(
*args
)
Создаёт Dataset с заданным шагом.
Например:
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 | Имеет ту же семантику, что и 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], step = args[2] |
| Возвращаемые значения | |
|---|---|
Dataset | Объект RangeDataset. |
| Исключения | |
|---|---|
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
| Аргументы | |
|---|---|
initial_state | Элемент, представляющий начальное состояние трансформации. |
reduce_func | Функция, отображающая (old_state, input_element) в new_state. Она должна принимать два аргумента и возвращать новый элемент. Структура new_state должна соответствовать структуре initial_state. |
| Возвращаемые значения | |
|---|---|
| Элемент набора данных, соответствующий конечному состоянию преобразования. |
repeat
repeat(
count=None
)
Повторяет этот набор данных count раз.
Примечание: Если этот набор данных зависит от глобального состояния (например, генератора случайных чисел), то разные повторения могут производить разные элементы.
| Аргументы | |
|---|---|
count | (Необязательно.) Скалярный tf.int64 tf.Tensor, представляющий количество повторений набора данных. По умолчанию (если count равно None или -1) набор данных повторяется бесконечно. |
| Возвращаемые значения | |
|---|---|
Dataset | Объект Dataset. |
shard
shard(
num_shards, index
)
Создаёт 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)
Важные замечания:
- Убедитесь, что фрагментация выполняется до использования любого оператора случайного выбора (например, перемешивания).
- В общем случае лучше использовать оператор фрагментации в начале конвейера набора данных. Например, при чтении из набора файлов 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)
| Аргументы | |
|---|---|
num_shards | Скаляр tf.int64 tf.Tensor, представляющий количество фрагментов, работающих параллельно. |
index | Скаляр tf.int64 tf.Tensor, представляющий индекс рабочего процесса. |
| Возвращает | |
|---|---|
Dataset | A Dataset. |
| Исключения | |
|---|---|
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 | A Dataset. |
skip
skip(
count
)
Создаёт Dataset, пропускающий count элементов из этого набора данных.
| Аргументы | |
|---|---|
count | Скаляр tf.int64 tf.Tensor, представляющий количество элементов из этого набора данных, которые должны быть пропущены, чтобы сформировать новый набор данных. Если count больше, чем размер этого набора данных, новый набор данных не будет содержать элементов. Если count равно -1, пропускается весь набор данных. |
| Возвращает | |
|---|---|
Dataset | A Dataset. |
take
take(
count
)
Создаёт Dataset с максимальным числом count элементов из этого набора данных.
| Аргументы | |
|---|---|
count | Скаляр tf.int64 tf.Tensor, представляющий количество элементов из этого набора данных, которые должны быть взяты, чтобы сформировать новый набор данных. Если count равно -1, или если count больше, чем размер этого набора данных, новый набор данных будет содержать все элементы этого набора данных. |
| Возвращает | |
|---|---|
Dataset | A 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'}
| Возвращает | |
|---|---|
Функция преобразования Dataset, которую можно передать в 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 | A Dataset вложенных окон — конечный набор данных плоских элементов, созданных из (вложений) входных элементов. |
with_options
with_options(
options
)
Возвращает новый tf.data.Dataset с заданными параметрами.
Параметры «глобальные» в том смысле, что они применяются ко всему набору данных. Если параметры задаются несколько раз, они объединяются, при условии, что разные параметры не используют разные значения, отличные от по умолчанию.
| Аргументы | |
|---|---|
options | tf.data.Options, который определяет используемые параметры. |
| Возвращает | |
|---|---|
Dataset | A Dataset с заданными параметрами. |
| Исключения | |
|---|---|
ValueError | при установке параметра более одного раза с нестандартным значением |
zip
@staticmethod
zip(
datasets
)
Создаёт 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) ]
| Аргументы | |
|---|---|
datasets | Вложенная структура наборов данных. |
| Возвращает | |
|---|---|
Dataset | A Dataset. |
__iter__
__iter__()
Создаёт Iterator для перечисления элементов этого набора данных.
Возвращаемый итератор реализует протокол Python итератора, поэтому он может использоваться только в режиме eager.
| Возвращает | |
|---|---|
An Iterator над элементами этого набора данных. |
| Исключения | |
|---|---|
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/compat/v2/data/Dataset