Замораживание весов в сети VGG19 для трансферного обучения в кафе
Причина, по которой я задаю этот вопрос, связана с тем, что в VGG19 есть уровни нормализации партии (в отличие, например, от VGG16).
Я пытаюсь обучить сеть Faster-RCNN в Кафе. Я делаю это путем:
- Загрузка предварительно обученной модели VGG19 ImageNet (файл весов + прототекст)
- Удаление полностью связанных слоев из файла prototxt
- Добавление слоев RPN и Fast-RCNN поверх сверточных слоев магистрали VGG19
Я ничего не изменил относительно lr_mult
значения сверточных слоев. В файле prototxt сверточные слои (например, conv1_1
и т. д. имеют ненулевое значение lr_mult
значения, в то время как слои пакетной нормализации lr_mult
значения установлены в 0 (слои, названные как conv1_1/bn
).
Означает ли факт, что пакетные нормализационные слои заморожены, означает, что сверточные слои также заморожены? Или я должен установить lr_mult
до 0 также в слоях с именем convX_X
?
Обновление: после запуска другого тренировочного процесса при обнулении lr_mult
из всех сверточных слоев, время обучения значительно сократилось, что означает, что ответ lr_mult
значение должно быть установлено в 0 также в convX_X
слои.
1 ответ
Чтобы правильно заморозить сверточные слои с батчормом в Кафе, вам необходимо:
- Для сверточных слоев: Set
lr_mult
параметр до 0 - Для слоев батчнорм: набор
lr_mult
параметры до 0, установитеuse_global_stats
вtrue
:
layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
batch_norm_param {
use_global_stats: true
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
}
Означает ли факт, что пакетные нормализационные слои заморожены, означает, что сверточные слои также заморожены?
Конечно, нет. Однако с помощью propagate_down
Как вы можете добиться этого эффекта: Как предотвратить обратные вычисления в определенных слоях в caffe.