Подтвердить что ты не робот

Как интерпретировать журнал caffe с помощью debug_info?

Когда возникают трудности во время обучения (nan s, потеря не сходится и т.д.), иногда полезно посмотреть более подробный журнал тренировок, установив debug_info: true в файле 'solver.prototxt'.

Затем журнал тренировок выглядит примерно так:

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)

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

4b9b3361

Ответ 1

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

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

Переслать

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

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

Слой "conv1" - это слой свертки, который содержит 2 парамакса: фильтры и смещение. Следовательно, журнал имеет три строки. В блоке фильтра (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 как данных, так и градиентов.

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

  • Если вы потеряли nan, посмотрите, в какой момент ваши данные или diff превращаются в nan: на каком уровне? на котором итерация?

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

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