11

При столкновении с трудностями во время обучения (nans, loss does not converge и т. Д.) Иногда полезно посмотреть более подробный учебный журнал, установив debug_info: true в файле 'solver.prototxt'.Как интерпретировать журнал caffe с debug_info?

Журнал обучения, то выглядит что-то вроде:

I1109 ...]  [Forward] Layer data, top blob data data: 0.343971  
I1109 ...]  [Forward] Layer conv1, top blob conv1 data: 0.0645037 
I1109 ...]  [Forward] Layer conv1, param blob 0 data: 0.00899114 
I1109 ...]  [Forward] Layer conv1, param blob 1 data: 0 
I1109 ...]  [Forward] Layer relu1, top blob conv1 data: 0.0337982 
I1109 ...]  [Forward] Layer conv2, top blob conv2 data: 0.0249297 
I1109 ...]  [Forward] Layer conv2, param blob 0 data: 0.00875855 
I1109 ...]  [Forward] Layer conv2, param blob 1 data: 0 
I1109 ...]  [Forward] Layer relu2, top blob conv2 data: 0.0128249 
. 
. 
. 
I1109 ...]  [Forward] Layer fc1, top blob fc1 data: 0.00728743 
I1109 ...]  [Forward] Layer fc1, param blob 0 data: 0.00876866 
I1109 ...]  [Forward] Layer fc1, param blob 1 data: 0 
I1109 ...]  [Forward] Layer loss, top blob loss data: 2031.85 
I1109 ...]  [Backward] Layer loss, bottom blob fc1 diff: 0.124506 
I1109 ...]  [Backward] Layer fc1, bottom blob conv6 diff: 0.00107067 
I1109 ...]  [Backward] Layer fc1, param blob 0 diff: 0.483772 
I1109 ...]  [Backward] Layer fc1, param blob 1 diff: 4079.72 
. 
. 
. 
I1109 ...]  [Backward] Layer conv2, bottom blob conv1 diff: 5.99449e-06 
I1109 ...]  [Backward] Layer conv2, param blob 0 diff: 0.00661093 
I1109 ...]  [Backward] Layer conv2, param blob 1 diff: 0.10995 
I1109 ...]  [Backward] Layer relu1, bottom blob conv1 diff: 2.87345e-06 
I1109 ...]  [Backward] Layer conv1, param blob 0 diff: 0.0220984 
I1109 ...]  [Backward] Layer conv1, param blob 1 diff: 0.0429201 
E1109 ...]  [Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07) 

Что это значит?

ответ

13

На первый взгляд вы можете видеть этот раздел журнала разделенным на два: [Forward] и [Backward]. Напомним, что обучение нейронной сети осуществляется путем распространения вперед-назад:
Пример обучения (пакетный) подается в сеть, а прямой проход выдает текущее предсказание.
Исходя из этого прогноза, вычисляется потеря. Потери затем выводятся, и градиент оценивается и распространяется назад, используя chain rule.

Caffe Blob структура данных
Просто быстро повторно колпачок. Caffe использует структуру данных Blob для хранения данных/весов/параметров и т. Д. Для этого обсуждения важно отметить, что Blob имеет две «части»: data и diff. Значения Blob хранятся в части data. Часть diff используется для хранения градиентов по элементам для этапа backpropagation.

вперед пройти

Вы увидите все слои снизу вверх, перечисленные в этой части бревна. Для каждого слоя вы увидите:

I1109 ...]  [Forward] Layer conv1, top blob conv1 data: 0.0645037 
I1109 ...]  [Forward] Layer conv1, param blob 0 data: 0.00899114 
I1109 ...]  [Forward] Layer conv1, param blob 1 data: 0 

Layer "conv1" представляет собой свертку слой, который имеет 2 Param сгустки: фильтры и предвзятость. Следовательно, журнал имеет три строки. Фильтр блоб (param blob 0) имеет data

I1109 ...]  [Forward] Layer conv1, param blob 0 data: 0.00899114 

То есть текущая норма L2 весов фильтра свертка 0,00899.
Ток смещения (param blob 1):

I1109 ...]  [Forward] Layer conv1, param blob 1 data: 0 

значение, которое в настоящее время смещение устанавливается равным 0.

И последнее, но не в последнюю очередь, "conv1" слой имеет выход, "top" имени "conv1" (как оригинальный ...).Норма L2 на выходе

I1109 ...]  [Forward] Layer conv1, top blob conv1 data: 0.0645037 

Обратите внимание, что все значения L2 для [Forward] прохода представлены на data части Blobs в вопросе.

Потеря и градиент
В конце прохода [Forward] приходит потери слой:

I1109 ...]  [Forward] Layer loss, top blob loss data: 2031.85 
I1109 ...]  [Backward] Layer loss, bottom blob fc1 diff: 0.124506 

В этом примере потеря партии является 2031,85, градиент w.r.t. потерь fc1 Рассчитано и передано diff часть fc1 Blob. Величина L2 градиента равна 0.1245.

назад проход
Все остальные слои перечислены в этой части сверху вниз. Вы можете видеть, что величины L2, о которых сообщалось сейчас, относятся к diff частим Blobs (входы параметров и слоев).

Наконец
Последняя строка журнала этой итерации:

[Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07) 

сообщает общее количество L1 и L2 величины обоих данных и градиентов.

Что я должен искать?

  1. Если у вас есть nans in your loss см, в какой момент ваши данные или диф превращается в nan: на каком уровне? на котором итерация?

  2. Посмотрите на величину градиента, они должны быть разумными. ЕСЛИ вы начинаете видеть значения с e+8, ваши данные/градиенты начинают взорваться. Уменьшите скорость обучения!

  3. Посмотрите, что diff s не равно нулю. Zero diffs означает отсутствие градиентов = нет обновлений = нет обучения. Если вы начали с случайных весов, подумайте о генерации случайных весов с большей дисперсией.

+0

Что изменилось бы, если разности равны нулю? – thigi

+1

@thigi зависит от архитектуры: например, если вы используете активацию «ReLU», а входные данные «равно нулю» - градиент будет равен нулю. Тогда вы можете подумать об изменении «рабочей точки», например, вычитая среднее значение. Кроме того, вы можете заменить 'ReLU' на' PReLU' ... – Shai

+0

@Shai: Почему здесь используется L1/L2? – Breeze

 Смежные вопросы

  • Нет связанных вопросов^_^