Данные о времени подачи в tf.estimator: `input_fn` должен вызываться - PullRequest
0 голосов
/ 27 февраля 2020

Цель

Я хочу изменить этот учебник , чтобы использовать этот набор данных временного ряда вместо обычных данных изображения.

Подход

Я определил несколько подходов для получения данных в tf.estimator API. Наиболее удобным (потому что использование .from_generator является догадкой ...) было использование tf.data.Dataset.from_tensor_slices(training_data_ndarray) следующим образом:

trnX, trnY, tstX, tstY = load_dataset()
trnXl = trnX.tolist()
tstXl = tstX.tolist()
tstYl = tstY.tolist()
trnYl = trnY.tolist()
trndataset = tf.data.Dataset.from_tensor_slices((trnXl, trnYl))
tstdataset = tf.data.Dataset.from_tensor_slices((tstXl, tstYl))
...
def _input_fn(partition):
    if partition == "train":
        dst = trndataset
    elif partition == "predict":
        dst = tstdataset
    else:
        dst = tstdataset

    return dst

Ошибка / выпуск

Ошибка типа: input_fn должен быть вызван, учитывая: DatasetV1Функции адаптера: ((128, 9), (6,)), типы: (tf.float32, tf.float32)>

Воспроизведение

Я использую экземпляр PaperSpace. Если у вас есть учетная запись, вы можете посмотреть здесь .

  1. Если нет, получите полный код в этой сущности: .
  2. Набор данных из 2 .

Настройка:

  • Tensorflow 1.15
  • Python 3.6.8
  • Стремительное выполнение: выкл. (Ad * ​​1061 * библиотека не сможет его обработать).

Ошибка при вызове:

tf.estimator.train_and_evaluate(
estimator,
train_spec=tf.estimator.TrainSpec(
    input_fn=_input_fn("train"),
    max_steps=TRAIN_STEPS),
eval_spec=tf.estimator.EvalSpec(
    input_fn=_input_fn("test"),
    steps=None,
    start_delay_secs=1,
    throttle_secs=1,  
))

Что теперь?

Я не вижу пути продвижения вперед, используя подход создания tf.data.Dataset, так как кажется, что функция ввода («создать функцию ввода, которая возвращает набор данных») неверна.

1 Ответ

0 голосов
/ 27 февраля 2020

Это может помочь кому-то в будущем, но это не решит мою более глубокую проблему.

Для того, чтобы input_fn мог вызываться, но все еще принимать аргументы, есть две опции: обернуть вызов функции в лямбда-операторе ИЛИ оберните фактический input_fn внутри другого input_fn, который возвращает внутреннюю функцию.

classifier.train(
input_fn=lambda: input_fn(train, train_y, training=True),
steps=5000)

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

Источник: https://www.tensorflow.org/tutorials/estimator/premade

...