tf.estimator.Estimator дает различную точность теста при разделении эпох по эпохам по сравнению со всеми эпохами.

Я определил простую CNN как мою модель_fn для tf.estimator.Estimator и передал ее с этим input_fn:

def input_fn(features, labels, batch_size, epochs):
    dataset = tf.data.Dataset.from_tensor_slices((features))
    dataset = dataset.map(lambda x: tf.cond(tf.random_uniform([], 0, 1) > 0.5, lambda: dataset_augment(x), lambda: x),
                          num_parallel_calls=16).cache()
    dataset_labels = tf.data.Dataset.from_tensor_slices((labels))
    dataset = dataset.zip((dataset, dataset_labels))
    dataset = dataset.shuffle(30000)
    dataset = dataset.repeat(epochs)
    dataset = dataset.batch(batch_size)
    dataset = dataset.prefetch(-1)
    return dataset

когда я обучаю оценщика таким образом, я получаю точность теста 43% после 10 эпох:

steps_per_epoch = data_train.shape[0] // batch_size
for epoch in range(1, epochs + 1):
    cifar100_classifier.train(lambda: input_fn(data_train, labels_train, batch_size, epochs=1), steps=steps_per_epoch)

Но когда я тренирую его таким образом, я получаю точность теста 32% после 10 эпох:

steps_per_epoch = data_train.shape[0] // batch_size
max_steps = epochs * steps_per_epoch
cifar100_classifier.train(steps=max_steps,
                              input_fn=lambda: input_fn(data_train, labels_train, batch_size, epochs=epochs))

Я просто не могу понять, почему эти два метода дают разные результаты. Кто-нибудь может объяснить?


person Shadi Rahimian    schedule 15.05.2019    source источник
comment
Как tog настраивает cifar100_classifier? Я предполагаю, что это связано со сбросом гиперпараметров в первом случае.   -  person McAngus    schedule 15.05.2019
comment
@McAngus Я создаю свою модель с помощью tf.keras.layers и использую AdamOptimizer для ее обучения. И я предполагаю, что контрольные точки сохраняют состояние как оптимизаторов, так и весов и смещений слоев. Таким образом, обучение модели за один раз будет иметь тот же эффект, что и загрузка из сохраненных контрольных точек в конце каждой эпохи и продолжение обучения для другой эпохи и так далее...   -  person Shadi Rahimian    schedule 15.05.2019


Ответы (2)


Поскольку вы вызываете input_fn несколько раз в первом примере, кажется, что вы будете генерировать больше дополненных данных через dataset_augment(x), поскольку вы выполняете подбрасывание монеты расширения для каждой x каждой эпохи.

Во втором примере вы делаете эти подбрасывания монеты только один раз, а затем обучаете несколько эпох на одних и тех же данных. Итак, здесь ваш набор поездов фактически «меньше».

.cache() на самом деле не спасает вас от этого в первом примере.

person Yolo Swaggins    schedule 31.05.2019
comment
На самом деле вы можете попытаться удалить .cache() из input_fn и посмотреть, не приведет ли к тому, что увеличение будет вызываться каждую эпоху в обеих формулировках, я не на 100% понимаю, как карта точно взаимодействует с повторением. - person Yolo Swaggins; 01.06.2019

веса вашей модели инициализируются случайным образом? это может быть случай.

person christk    schedule 15.05.2019
comment
Я использую tf.keras.layers и ничего не устанавливаю вручную. Но как это повлияет на мою подготовку? Разве объект tf.estimator.Estimator не загружается из сохраненных контрольных точек (с весами и переменными, рассчитанными до этой точки) и не продолжается с этой точки, если вы перебираете эпохи? - person Shadi Rahimian; 15.05.2019
comment
Когда nn инициализирует веса в первый раз, он использует некоторые методы инициализации, поэтому у вас не может быть одинаковых выходных данных в разных исполнениях. По умолчанию kernel_initializer для Conv2d, например. это 'glorot_uniform', как вы можете видеть в исходном коде здесь noreferrer">github.com/keras-team/keras/blob/ . вот некоторая информация об этом инициализаторе: tensorflow.org/api_docs/python/tf/glorot_uniform_initializer< /а> . Вы можете попробовать добавить еще один инициализатор и установить начальное значение. - person christk; 15.05.2019
comment
Я думаю, вы неправильно поняли проблему :) проблема не в том, что разные результаты в разных прогонах. - person Shadi Rahimian; 15.05.2019