Я создаю оценщик TensorFlow, который хочу обучить и оценить с помощью функции tf.estimator.train_and_evaluate()
. doc для этой функции дает следующий совет:
Также рекомендуется обучить модель немного дольше, скажем, несколько эпох, прежде чем выполнять оценку, поскольку конвейер ввода начинается с нуля для каждого обучения.
Это имеет смысл, поскольку train_and_evaluate()
работает, чередуя вызовы estimator.train()
и estimator.evaluate()
, разрушая вычислительный граф для каждого нового вызова. В моем случае это проблема, так как я хочу оценивать модель относительно часто, и мой input_fn
, похоже, имеет много накладных расходов при настройке. Сейчас это выглядит примерно так:
def input_fn():
# Build dataset from generator
dataset = tf.data.Dataset.from_generator(
generator=instance_generator,
output_types=types,
output_shapes=shapes,
)
dataset = dataset.shuffle(buffer_size=dataset_size)
dataset = dataset.repeat(epochs_per_eval)
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)
return dataset
Я подозреваю, что большая часть временных затрат на эту функцию связана с перетасовкой, поскольку для этого сначала требуется сгенерировать весь набор данных. Перетасовка, наверное, не медленная, но мой instance_generator
медленный. В идеале я хотел бы найти способ избежать необходимости перестраивать набор данных из генератора для каждого вызова поезда / eval. Есть ли способ добиться этого с помощью класса Dataset? Есть ли способ кэшировать состояние набора данных после его создания, чтобы каждый новый вызов input_fn
после первого становился менее затратным?