caffe
Batch-normalisatie
Zoeken…
Invoering
Uit de documenten :
"Normaliseert de invoer om een 0-gemiddelde en / of eenheid (1) variantie over de batch te hebben.
Deze laag berekent batchnormalisatie zoals beschreven in [1].
[...]
[1] S. Ioffe en C. Szegedy, "Batchnormalisatie: versnelling van diepe netwerktraining door interne Covariate Shift te verminderen." arXiv preprint arXiv: 1502.03167 (2015). "
parameters
| Parameter | Details |
|---|---|
| use_global_stats | Uit de post van rohrbach van 2 maart 2016 - misschien weet hij: |
| (Use_global_stats) | "Standaard berekent het netwerk tijdens de trainingstijd globale gemiddelde / variantie-statistieken via een lopend gemiddelde, dat vervolgens tijdens de testtijd wordt gebruikt om deterministische output voor elke input mogelijk te maken. U kunt handmatig schakelen of het netwerk accumuleert of de statistieken gebruikt via de optie use_global_stats BELANGRIJK: om deze functie te laten werken, MOET u de leersnelheid op nul zetten voor alle drie parameter-blobs, dwz param {lr_mult: 0} drie keer in de laagdefinitie. |
| (Use_global_stats) | Dit betekent standaard (omdat het volgende is ingesteld in batch_norm_layer.cpp), u helemaal geen use_global_stats hoeft in te stellen in de prototxt. use_global_stats_ = this-> phase_ == TEST; " |
Prototxt voor training
Het volgende is een voorbeelddefinitie voor het trainen van een BatchNorm-laag met kanaalschaal en bias. Gewoonlijk wordt een BatchNorm-laag ingevoegd tussen convolutie- en rectificatielagen. In dit voorbeeld zou de convolutie de blob layerx en de rectificatie de layerx-bn blob ontvangen.
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
}}
Meer informatie is te vinden in deze thread .
Prototxt voor implementatie
De belangrijkste verandering die nodig is, is om use_global_stats op true . Dit schakelt over naar het voortschrijdend gemiddelde.
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)
}}