caffe
Нормализация партии
Поиск…
Вступление
Из документов :
«Нормализует вход, чтобы иметь 0-среднюю и / или единицу (1) дисперсию в партии.
Этот слой вычисляет стандартную партию, как описано в [1].
[...]
[1] С. Иоффе и С. Сегеди, «Нормализация партии: ускорение глубокого сетевого обучения путем сокращения внутреннего сдвига ковариации». arXiv preprint arXiv: 1502.03167 (2015). "
параметры
| параметр | подробности |
|---|---|
| use_global_stats | Из поста Рорбаха со 2 марта 2016 года - может быть, он знает: |
| (use_global_stats) | «По умолчанию во время обучения сеть вычисляет статистику среднего среднего / дисперсии по среднему среднему значению, которая затем используется во время тестирования для обеспечения детерминированных выходов для каждого входа. Вы можете вручную переключать, собирает ли сеть или использует статистику с помощью опции use_global_stats. ВАЖНО: для работы этой функции вы ДОЛЖНЫ установить скорость обучения в ноль для всех трех параметров blob, т. е. param {lr_mult: 0} три раза в определении слоя. |
| (use_global_stats) | Это означает, что по умолчанию (как указано в batch_norm_layer.cpp), вам не нужно устанавливать use_global_stats вообще в прототипе. use_global_stats_ = this-> phase_ == TEST; " |
Прототип для обучения
Ниже приведен пример определения для обучения слою BatchNorm с канальной шкалой и смещением. Обычно слой BatchNorm вставлен между слоями свертки и выпрямления. В этом примере свертка выводит layerx и выпрямление будет получать layerx-bn .
layer { bottom: 'layerx' top: 'layerx-bn' name: 'layerx-bn' type: 'BatchNorm'
batch_norm_param {
use_global_stats: false # calculate the mean and variance for each mini-batch
moving_average_fraction: .999 # doesn't effect training
}
param { lr_mult: 0 }
param { lr_mult: 0 }
param { lr_mult: 0 }}
# channel-wise scale and bias are separate
layer { bottom: 'layerx-bn' top: 'layerx-bn' name: 'layerx-bn-scale' type: 'Scale',
scale_param {
bias_term: true
axis: 1 # scale separately for each channel
num_axes: 1 # ... but not spatially (default)
filler { type: 'constant' value: 1 } # initialize scaling to 1
bias_filler { type: 'constant' value: 0.001 } # initialize bias
}}
Более подробную информацию можно найти в этой теме .
Прототип для развертывания
Главное изменение необходимо переключить use_global_stats на true . Это переключается на использование скользящей средней.
layer { bottom: 'layerx' top: 'layerx-bn' name: 'layerx-bn' type: 'BatchNorm'
batch_norm_param {
use_global_stats: true # use pre-calculated average and variance
}
param { lr_mult: 0 }
param { lr_mult: 0 }
param { lr_mult: 0 }}
# channel-wise scale and bias are separate
layer { bottom: 'layerx-bn' top: 'layerx-bn' name: 'layerx-bn-scale' type: 'Scale',
scale_param {
bias_term: true
axis: 1 # scale separately for each channel
num_axes: 1 # ... but not spatially (default)
}}