Ответ 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 означает отсутствие градиентов = нет обновлений = нет обучения. Если вы начали с случайных весов, рассмотрите возможность генерации случайных весов с большей дисперсией.