tf.keras.utils.PyDataset
Базовый класс для определения параллельного набора данных с помощью кода Python.
tf.keras.utils.PyDataset(
workers=1, use_multiprocessing=False, max_queue_size=10
)
Каждый PyDataset должен реализовывать методы __getitem__() и __len__(). Если вы хотите изменять набор данных между эпохами, можно также реализовать on_epoch_end(). Метод __getitem__() должен возвращать полный пакет (а не отдельный образец), а метод __len__ должен возвращать количество пакетов в наборе данных (а не количество образцов).
| Аргументы | |
|---|---|
workers | Количество рабочих процессов для многопоточности или многопроцессности. |
use_multiprocessing | Использовать ли многопроцессность Python для параллельной обработки. Значение True означает, что набор данных будет скопирован в несколько порождённых процессов. Это необходимо для получения преимуществ параллельной обработки на уровне вычислений (а не ввода-вывода). Однако для этого параметр можно установить в True только в том случае, если набор данных можно безопасно сериализовать с помощью pickle. |
max_queue_size | Максимальное количество пакетов, хранящихся в очереди при переборе набора данных в многопоточном или многопроцессном режиме. Уменьшите это значение, чтобы снизить потребление оперативной памяти процессором для набора данных. По умолчанию — 10. |
Примечания:
-
PyDataset— более безопасный способ использования многопроцессности. Эта структура гарантирует, что модель обучается на каждом образце только один раз за эпоху, чего нельзя сказать о генераторах Python. - Аргументы
workers,use_multiprocessingиmax_queue_sizeпредназначены для настройки использования параллельной обработки при переборе набора данных с помощьюfit(). Сам классPyDatasetих напрямую не использует. При ручном перебореPyDatasetпараллельная обработка не применяется.
Пример:
from skimage.io import imread
from skimage.transform import resize
import numpy as np
import math
# Here, `x_set` is list of path to the images
# and `y_set` are the associated classes.
class CIFAR10PyDataset(keras.utils.PyDataset):
def __init__(self, x_set, y_set, batch_size, **kwargs):
super().__init__(**kwargs)
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
# Return number of batches.
return math.ceil(len(self.x) / self.batch_size)
def __getitem__(self, idx):
# Return x, y for batch idx.
low = idx * self.batch_size
# Cap upper bound at array length; the last batch may be smaller
# if the total number of items is not a multiple of batch size.
high = min(low + self.batch_size, len(self.x))
batch_x = self.x[low:high]
batch_y = self.y[low:high]
return np.array([
resize(imread(file_name), (200, 200))
for file_name in batch_x]), np.array(batch_y)
| Атрибуты | |
|---|---|
max_queue_size | |
num_batches | Количество пакетов в PyDataset. |
use_multiprocessing | |
workers | |
Методы
on_epoch_end
on_epoch_end()
Метод, вызываемый в конце каждой эпохи.
__getitem__
__getitem__(
index
)
Получает пакет в позиции index.
| Аргументы | |
|---|---|
index | позиция пакета в PyDataset. |
| Возвращает | |
|---|---|
| Пакет |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/utils/PyDataset