Установленный способ использования TF Dataset API в Keras состоит в том, чтобы передать `model.fit` с помощью make_one_shot_iterator ()`, но этот итератор хорош только для одной эпохи - PullRequest
0 голосов
/ 31 марта 2019

Edit:

Чтобы прояснить, почему этот вопрос отличается от предложенных дубликатов, этот вопрос SO рассматривает те предложенные дубликаты, что именно делает Keras с методами, описанными в этих вопросах SO. Предложенные дубликаты задаются с использованием API набора данных make_one_shot_iterator() в model.fit, мое продолжение заключается в том, что make_one_shot_iterator() может проходить набор данных только один раз, однако в приведенных решениях указано несколько эпох.


Это продолжение этих вопросов SO

Как правильно объединить API набора данных TensorFlow и Keras?

Тензорные кера с входным набором данных tf

Использование tf.data.Dataset в качестве учебного ввода для модели Keras НЕ работает

Где "Начиная с Tensorflow 1.9, можно передать объект tf.data.Dataset непосредственно в keras.Model.fit (), и он будет действовать аналогично fit_generator". У каждого примера есть итератор набора данных TF, который подается в Kera model.fit.

Пример приведен ниже

# Load mnist training data
(x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
training_set = tfdata_generator(x_train, y_train,is_training=True)

model = # your keras model here              
model.fit(
    training_set.make_one_shot_iterator(),
    steps_per_epoch=len(x_train) // 128,
    epochs=5,
    verbose = 1)

Однако, согласно руководству API Tensorflow Dataset (здесь https://www.tensorflow.org/guide/datasets):

Однократный итератор - это самая простая форма итератора, которая только поддерживает итерацию один раз по набору данных

Так что это хорошо только на 1 эпоху. Однако коды в вопросах SO определяют несколько эпох, в приведенном выше примере кода указано 5 эпох.

Есть ли объяснение этому противоречию? Знает ли Керас, что, пройдя через набор данных один итератор, он может повторно инициализировать и перемешать данные?

1 Ответ

2 голосов
/ 31 марта 2019

Вы можете просто передать объект набора данных в model.fit, Keras будет обрабатывать итерации. Учитывая один из готовых наборов данных:

train, test = tf.keras.datasets.cifar10.load_data()
dataset = tf.data.Dataset.from_tensor_slices((train[0], train[1]))

Это создаст объект набора данных из обучающих данных набора данных cifar10. В этом случае функция разбора не нужна. Если вы создаете набор данных из пути, содержащего изображения из списка массивов, вам понадобится один.

dataset = tf.data.Dataset.from_tensor_slices((image_path, labels_path)) 

В случае, если вам понадобится функция для загрузки фактических данных из имени файла. Массив Numpy может быть обработан таким же образом, только без tf.read_file

def parse_func(filename):
    f = tf.read_file(filename)
    image = tf.image.decode_image(f)
    label = #get label from filename
    return image, label

Затем вы можете перемешать, пакетировать и отобразить любую функцию синтаксического анализа в этом наборе данных. Вы можете контролировать, сколько примеров будет предварительно загружено с помощью буфера перемешивания. Повторите контроль количества эпох и лучше не указывать ни одного, поэтому он будет повторяться бесконечно. Вы можете использовать либо обычную пакетную функцию, либо комбинировать с

dataset = dataset.shuffle().repeat()
dataset.apply(tf.data.experimental.map_and_batch(map_func=parse_func, batch_size,num_parallel_batches))

Затем объект набора данных может быть передан в model.fit model.fit (набор данных, эпохи, steps_per_epoch). Обратите внимание, что steps_per_epoch является необходимым параметром в этом случае, он будет определять, когда начинать новую эпоху. Так что вам придется знать размер эпохи заранее.

...