Многократное выполнение оценки дает разные потери в TensorFlow.

Я начинаю работать с TensorFlow. https://www.tensorflow.org/get_started/

Пока я несколько раз оценивал, как подавать данные, я обнаружил, что потери меняются при выполнении.

eval_input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                          num_epochs=1)
estimator.evaluate(input_fn = eval_input_fn)

Например, у меня были следующие убытки:

0,024675447 или 0,030844312, когда batch_size == 2, num_epochs == 2

0,020562874 или 0,030844312, когда batch_size == 4, num_epochs == 2

0,015422156 или 0,030844312, когда batch_size == 4, num_epochs == 1

Является ли это явление нормальным? Я не понимаю принципа, лежащего в основе этого.

--- добавлено следующее

То же самое происходит, когда я использую next_batch и eval() без переобучения, как в https://www.tensorflow.org/get_started/mnist/pros. Когда я запускаю следующую ячейку:

# mnist.test.labels.shape: (10000, 10)
for i in range(10):
    batch = mnist.test.next_batch(1000)
    print("test accuracy %g"%accuracy.eval(feed_dict={
        x: batch[0], y_: batch[1], keep_prob: 1.0}))

я получил

a)

точность теста 0,99

точность теста 0,997

точность теста 0,986

точность теста 0,993

точность теста 0,994

точность теста 0,993

точность теста 0,995

точность теста 0,995

точность теста 0,99

точность теста 0,99

b)

точность теста 0,99

точность теста 0,997

точность теста 0,989

точность теста 0,992

точность теста 0,993

точность теста 0,992

точность теста 0,994

точность теста 0,993

точность теста 0,993

точность теста 0,99

и они (и их среднее значение) продолжают меняться.


person Change-the-world    schedule 02.05.2017    source источник


Ответы (1)


Это вполне нормально и даже используется во многих статьях.

Первое, что нужно отметить, это то, что вы начинаете со случайно инициализированных весов. Если вы тренируетесь много раз, вы обнаружите среднее значение и дисперсию своих результатов, часто много точек разницы в точности в общих задачах классификации. Это нормально тренироваться несколько раз и выбирать лучший результат. Вы должны знать, что это подгоняет вашу модель к вашим тестовым данным (вы выбираете лучшую модель, которой, возможно, просто повезло с этими конкретными тестовыми данными, не обещая, что она будет обобщена и на другие невидимые данные). Вот почему вы используете данные обучения/проверки/тестирования. Тренируйтесь на train данных, проверяйте параметры на validation данных с большим количеством итераций обучения, а затем публикуйте только результаты на ваших test данных, которые не использовались более чем в 1 итерации.

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

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

Обратите внимание, что среди лучших результатов в рукописном наборе данных MNIST, указанном на странице Лекуна, есть комитет из 35 сверточных нейронных сетей, проголосовавших за него.

http://yann.lecun.com/exdb/mnist/

person David Parks    schedule 02.05.2017
comment
Спасибо за ваш ответ, но я думаю, что есть недоразумение. Я отделил этап оценки от этапа настройки, поэтому обучение выполняется только один раз. Только эта строка estimator.evaluate(input_fn = eval_input_fn) выполняется несколько раз, и тогда у меня разные потери, независимо от размера партии или количества эпох, которые я даю. На самом деле, я не понимаю, почему у нас есть размер пакета и количество эпох в оценке. - person Change-the-world; 05.05.2017