caffe
Normalizacja partii
Szukaj…
Wprowadzenie
Z dokumentów :
„Normalizuje dane wejściowe, tak aby miały 0-średnią i / lub wariancję jednostki (1) w całej partii.
Ta warstwa oblicza normalizację partii zgodnie z opisem w [1].
[...]
[1] S. Ioffe i C. Szegedy, „Normalizacja partii: przyspieszenie głębokiego szkolenia w sieci poprzez ograniczenie wewnętrznej zmiany współzmiennej”. nadruk arXiv arXiv: 1502.03167 (2015). ”
Parametry
| Parametr | Detale |
|---|---|
| use_global_stats | Ze stanowiska rohrbacha z 2 marca 2016 r. - może wie: |
| (use_global_stats) | „Domyślnie w czasie szkolenia sieć oblicza globalne statystyki średniej / wariancji za pomocą średniej bieżącej, która jest następnie wykorzystywana w czasie testu, aby umożliwić deterministyczne wyniki dla każdego wejścia. Możesz ręcznie przełączać, czy sieć gromadzi, czy używa statystyk za pomocą opcji use_global_stats WAŻNE: aby ta funkcja działała, MUSISZ ustawić szybkość uczenia się na zero dla wszystkich trzech obiektów blob parametrów, tj. trzykrotnie param {lr_mult: 0} w definicji warstwy. |
| (use_global_stats) | Oznacza to, że domyślnie (ponieważ w pliku batch_norm_layer.cpp podano poniżej), nie trzeba w ogóle ustawiać use_global_stats w prototxt. use_global_stats_ = this-> phase_ == TEST; " |
Prototxt do treningu
Poniżej znajduje się przykładowa definicja szkolenia warstwy BatchNorm ze skalą i odchyleniem w kanale. Zazwyczaj warstwa BatchNorm jest wstawiana między warstwy splotu i rektyfikacji. W tym przykładzie splot wyprowadziłby blob layerx a rektyfikacja otrzymałaby blob 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
}}
Więcej informacji można znaleźć w tym wątku .
Prototxt dla wdrożenia
Główną potrzebną zmianą jest przełączenie use_global_stats na true . Przełącza się to na użycie średniej ruchomej.
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)
}}