Как мы узнаем, что модель сошлась во время обучения нейронной сети для классификации / обнаружения объектов? - PullRequest
0 голосов
/ 01 октября 2018

Я использую API обнаружения объектов Tensorflow для обнаружения автомобилей.Он должен определять автомобили как один класс "автомобиль".

Я следовал за следующими сериями sentdex:

https://pythonprogramming.net/introduction-use-tensorflow-object-detection-api-tutorial/

Системная информация:

OS -Ubuntu 18.04 LTS

GPU - Nvidia 940M (VRAM: 2 ГБ)

Тензор потока: 1,10

Python - 3,6

ЦП - Intel i5

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

$tensorboard --logdit="training"

Но даже после тренировки с шагом 60 кбит потери колеблются от 2,1 до 1,2.Если я прекращаю обучение и экспортирую граф вывода из последней контрольной точки (сохраненной в обучении / папке), в некоторых случаях он обнаруживает автомобили, а в некоторых дает ложные срабатывания.

Я также пытался запустить eval.py , как показано ниже,

python3 eval.py     --logtostderr     --pipeline_config_path=training/ssd_mobilenet_v1_pets.config     --checkpoint_dir=training/     --eval_dir=eval/

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

Итак, я прекращаю обучение, чтобы убедиться, что графический процессор свободен, и затем запускаю eval.py , но он создает только одну точку eval в папке eval /.Почему?

Кроме того, как я могу понять из графиков точности в Tensorboard, что тренировку нужно остановить?

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

Спасибо.

PS: добавлен график общей потери ниже до 66k шагов.

enter image description here

PS2: после 2-х дней тренировок (и до сих пор включен) ниже приведен график общих потерь.

enter image description here

1 Ответ

0 голосов
/ 01 октября 2018

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

  • Учебный набор: Данные, используемые для обучения модели.
  • Набор проверки: Отдельный набор данных, который будет использоваться для измерения ошибки во время обучения.Данные этого набора не используются для обновления весов.
  • Набор тестов: Этот набор используется для измерения производительности модели после тренировки.

В вашем случае вам нужно будет определить отдельный набор данных, набор проверки и выполнить оценку повторно после фиксированного количества пакетов / шагов и зарегистрировать ошибку или точность.Обычно происходит то, что ошибка в этих данных будет уменьшаться в начале и увеличиваться в определенный момент во время тренировки.Поэтому важно отслеживать эту ошибку и создавать контрольную точку всякий раз, когда эта ошибка уменьшается.Контрольная точка с наименьшей ошибкой в ​​ваших данных проверки - это та, которую вы хотите использовать.Эта техника называется Ранняя остановка .

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

Редактировать: Вот пример тренировочного цикла с процедурой ранней остановки:

 for step in range(1, _MAX_ITER):
     if step % _TEST_ITER == 0:
         sample_count = 0
         while True:
                try:
                    test_data = sess.run(test_batch)
                    test_loss, summary = self._model.loss(sess, test_data[0], self._assign_target(test_data), self._merged_summary)
                    sess.run(self._increment_loss_opt, feed_dict={self._current_loss_pl: test_loss})
                    sample_count += 1
                except tf.errors.OutOfRangeError:
                    score = sess.run(self._avg_batch_loss, feed_dict={self._batch_count_pl: sample_count})
                    best_score =sess.run(self._best_loss)
                    if score < best_score:
                        '''
                        Save your model here...
                        '''
...