Тензорный поток 1.10+: переход эпохи к оценке input_fn? - PullRequest
1 голос
/ 14 июня 2019

A tf.estimator input_fn подпись может выглядеть примерно так:

def input_fn(files:list, params:dict):
    dataset = tf.data.TFRecordDataset(files)
                .map(lambda record: parse_record_fn(record))

    if params['mode'] == 'train':
        # train specific things
    # ...

Такое определение позволяет одному затем построить все свои input_fn s следующим образом:

train_fn = lambda: input_fn(files['training_set'], {**params, **{"mode": "train"}})
valid_fn = lambda: input_fn(files['validation_set'], {**params, **{"mode": "eval"}})
test_fn  = lambda: input_fn(files['test_set'],  {**params, **{"mode": "test"}})


train_spec = tf.estimator.TrainSpec(input_fn=train_fn, ...)
eval_spec  = tf.estimator.EvalSpec(input_fn=valid_fn,  ...)  

Мой вопрос заключается в том, как изменить сигнатуру input_fn, чтобы учесть вариации на основе эпох.Я понимаю, что это может создать бутылочное горлышко, но было бы неплохо, если бы я мог сделать что-то вроде:


def input_fn(...):
    # see above

    epoch = params["epoch"]
    if epoch % 100 == 0:
        # modify or make a new dataset

    # ...
    return dataset.make_one_shot_iterator().get_next()

Ключ в том, чтобы убедиться, что input_fn все еще совместим с:

tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

1 Ответ

1 голос
/ 14 июня 2019

Я не знаю ни одной опции, которая бы предоставляла число epoch как параметр как таковой.

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

Например, если у меня есть 2 набора данных: ds1 и ds2 говорят и хотят использовать ds1 всякий раз, когда "epoch "число не делится на 100, тогда я могу просто создать новый набор данных, выполнив что-то вроде:

dataset = ds1.repeat(99).concatenate(ds2)

, так как наборы данных по умолчанию загружаются лениво. Мне не нужно беспокоиться о последствиях для памяти (я незагрузка в память в 100 раз больше данных).

Очевидно, что это влияет на размер набора данных, поэтому вам нужно подумать о стратегии шагов между eval ops / callbacks и т. Д., Но это должно быть достаточно легко настроить.

...