2017-02-19 23 views
0

Я прочитал еще несколько сообщений о том, что делать, когда вы наносите nan на потерю обучения/проверки. Я предполагаю, что моя проблема недостаточна в моей скорости обучения, хотя мне интересно, может ли кто-то просто взглянуть и согласиться/не согласиться.Тренировочные/валидационные потери Наные вопросы

Я следую за потрясающим сообщением в блоге here, но реализую в тензорном потоке. Достаточно легко преобразовать модель, но импульс и скорость обучения немного сложнее, и я думаю, что это проблема. У меня проблемы, когда я могу пройти столько эпох, прежде чем потеря скачет и нан. Модель, которую я использую, должна быть эквивалентна net4/5 в учебнике блога.

... Epoch /Time/Train Loss/Valid Loss/Learn Rate 
Epoch[ 900]0:14:11 0.000116 0.001566 0.027701 
Epoch[ 910]0:14:20 0.000107 0.001565 0.026593 
Epoch[ 920]0:14:29 0.000098 0.001564 0.026593 
Epoch[ 930]0:14:39 0.000088 0.001567 0.026593 
Epoch[ 940]0:14:48 0.000080 0.001567 0.026593 
Epoch[ 950]0:14:58 0.000069 0.001578 0.026593 
Epoch[ 960]0:15: 7 0.000072 0.001600 0.026593 
Epoch[ 970]0:15:17 0.000105 0.001664 0.026593 
Epoch[ 980]0:15:26 0.000221 0.001799 0.026593 
Epoch[ 990]0:15:35 0.000456 0.002045 0.026593 
Epoch[1000]0:15:45 0.000955 0.002473 0.025530 
Epoch[1010]0:15:54 0.002148 0.003415 0.025530 
Epoch[1020]0:16: 4 0.008455 0.009337 0.025530 
Epoch[1030]0:16:13 0.009042 0.010412 0.025530 
Epoch[1040]0:16:22 nan nan 0.025530 

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

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

... Epoch /Time/Train Loss/Valid Loss/Learn Rate 
Epoch[ 0]0: 0: 1 0.025211 0.025614 0.045000 
Epoch[ 10]0: 0:11 0.003496 0.004075 0.045000 
Epoch[ 20]0: 0:22 0.003202 0.003742 0.045000 
Epoch[ 30]0: 0:32 0.003169 0.003712 0.045000 
Epoch[ 40]0: 0:42 0.003084 0.003605 0.045000 
Epoch[ 50]0: 0:53 0.002976 0.003507 0.045000 
Epoch[ 60]0: 1: 3 0.002891 0.003437 0.045000 
Epoch[ 70]0: 1:14 0.002795 0.003381 0.045000 
Epoch[ 80]0: 1:24 0.002648 0.003317 0.045000 
Epoch[ 90]0: 1:34 0.002408 0.003181 0.011250 
Epoch[ 100]0: 1:45 0.002267 0.003107 0.011250 
Epoch[ 110]0: 1:55 0.001947 0.003003 0.011250 
Epoch[ 120]0: 2: 6 0.004507 0.005768 0.011250 
Epoch[ 130]0: 2:16 nan nan 0.011250 

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

Мой код: https://github.com/sdeck51/CNNTutorials/blob/master/7.%20FacialFeatureDetection_Tutorial/FaceDetector.ipynb

EDIT:

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

InputLayer   (None, 1, 96, 96)  produces 9216 outputs 
Conv2DCCLayer   (None, 32, 94, 94)  produces 282752 outputs 
MaxPool2DCCLayer  (None, 32, 47, 47)  produces 70688 outputs 
Conv2DCCLayer   (None, 64, 46, 46)  produces 135424 outputs 
MaxPool2DCCLayer  (None, 64, 23, 23)  produces 33856 outputs 
Conv2DCCLayer   (None, 128, 22, 22)  produces 61952 outputs 
MaxPool2DCCLayer  (None, 128, 11, 11)  produces 15488 outputs 
DenseLayer   (None, 500)    produces  500 outputs 
DenseLayer   (None, 500)    produces  500 outputs 
DenseLayer   (None, 30)    produces  30 outputs 

и я только что обновил мой, так что я думаю, что теперь это то же самое.

conv: input size: (?, 96, 96, 1) 
pool: input size: (?, 94, 94, 32) 
conv: input size: (?, 47, 47, 32) 
pool: input size: (?, 46, 46, 64) 
conv: input size: (?, 23, 23, 64) 
pool: input size: (?, 22, 22, 128) 
fc: input size before flattening: (?, 11, 11, 128) 
fc: input size: (?, 15488) 
fc: input size: (?, 500) 
fc: input size: (?, 500) 
out: (?, 30) 

Все еще не работает. Когда выпадение включено на слоях свертки и первом полностью подключенном слое, модель длится менее 50 эпох, а затем ошибка проходит через крышу. Даже при очень малых уровнях обучения проблема все еще возникает.

Epoch[ 0]0: 0: 1 0.029732 0.030537 0.030000 
Epoch[ 10]0: 0:11 0.004211 0.004986 0.030000 
Epoch[ 20]0: 0:20 0.003013 0.003530 0.004500 
Epoch[ 30]0: 0:30 5.250690 5.426279 0.004500 
Epoch[ 40]0: 0:40 nan nan 0.000675 

И это выглядит как метод не недоучка сломан и делает то же самое> _> ...

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

Запуск с выпадением сейчас, и он не взрывается, поэтому я думаю, что исправил проблему.

+0

Итак, я нашел в моей модели большой вопрос.Я не настроил параметры уровня свертки правильно, поэтому я собираюсь пройти пропуск и убедиться, что все правильно, а затем посмотреть, есть ли у меня все те же проблемы. – Exuro

ответ

0

Проблема была действительно оптимизатором. Я использую оптимизатор Momentum, и у меня он первоначально установлен на 0,9, и он должен стать 0,999 в конце его циклов эпохи. По какой-то причине дополнительный импульс вызывает потерю ракеты Sky. Оставляя это как .9, проблема устранена.