Метод from_generator
Метод from_generator класса Dataset создает датасет
из Python-генератора. Первым параметром метод принимает функцию-генератор,
вторым - параметр output_signature с описанием типов и форм
элементов, третьим - параметр output_types с типами данных,
четвертым - параметр output_shapes с формами тензоров.
Метод удобен, когда данные нельзя загрузить в память целиком,
а нужно порождать их на лету.
Синтаксис
tf.data.Dataset.from_generator(
generator,
output_signature,
output_types,
output_shapes,
args
)
Пример
Давайте создадим датасет из простого генератора чисел:
import tensorflow as tf
def gen():
for i in range(5):
yield i
ds = tf.data.Dataset.from_generator(
gen,
output_signature=tf.TensorSpec(shape=(), dtype=tf.int32)
)
for elem in ds:
print(elem)
Результат выполнения кода:
tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor(4, shape=(), dtype=int32)
Пример
Давайте создадим датасет из генератора, возвращающего тензоры:
import tensorflow as tf
def gen():
for i in range(3):
yield tf.constant([1, 2, 3])
ds = tf.data.Dataset.from_generator(
gen,
output_signature=tf.TensorSpec(shape=(3,), dtype=tf.int32)
)
for elem in ds:
print(elem)
Результат выполнения кода:
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
Пример
Давайте передадим аргументы в генератор через параметр args:
import tensorflow as tf
def gen(n):
for i in range(n):
yield tf.constant(i, dtype=tf.int32)
ds = tf.data.Dataset.from_generator(
gen,
output_signature=tf.TensorSpec(shape=(), dtype=tf.int32),
args=[4]
)
for elem in ds:
print(elem.numpy())
Результат выполнения кода:
0
1
2
3
Пример
Давайте создадим датасет из генератора строк:
import tensorflow as tf
def gen():
yield 'abcde'
yield 'model.keras'
ds = tf.data.Dataset.from_generator(
gen,
output_signature=tf.TensorSpec(shape=(), dtype=tf.string)
)
for elem in ds:
print(elem.numpy().decode('utf-8'))
Результат выполнения кода:
abcde
model.keras
Пример
Давайте создадим датасет из генератора пар тензор-метка:
import tensorflow as tf
def gen():
for i in range(3):
yield tf.constant([1, 2, 3]), tf.constant(i)
ds = tf.data.Dataset.from_generator(
gen,
output_signature=(
tf.TensorSpec(shape=(3,), dtype=tf.int32),
tf.TensorSpec(shape=(), dtype=tf.int32)
)
)
for x, y in ds:
print(x.numpy(), y.numpy())
Результат выполнения кода:
[1 2 3] 0
[1 2 3] 1
[1 2 3] 2
Смотрите также
-
класс
Dataset,
который представляет собой набор данных -
метод
from_tensor_slices,
который создает датасет из тензоров -
метод
from_tensors,
который создает датасет из одного тензора -
метод
range,
который создает датасет из диапазона чисел