モデルで _"BatchNorm"
_ レイヤーをどのように使用/挿入するかについて少し混乱しています。
たとえば、いくつかの異なるアプローチが見られます。
"BatchNorm"
_ + _"Scale"
_(パラメーター共有なし)_"BatchNorm"
_レイヤーの直後に_"Scale"
_レイヤーが続きます:
_layer {
bottom: "res2a_branch1"
top: "res2a_branch1"
name: "bn2a_branch1"
type: "BatchNorm"
batch_norm_param {
use_global_stats: true
}
}
layer {
bottom: "res2a_branch1"
top: "res2a_branch1"
name: "scale2a_branch1"
type: "Scale"
scale_param {
bias_term: true
}
}
_
"BatchNorm"
_のみCaffeで提供されているcifar10の例では、_"BatchNorm"
_が後に続く_"Scale"
_なしで使用されています。
_layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
}
_
TRAIN
とTEST
で_batch_norm_param
_が異なる_batch_norm_param: use_global_scale
_はTRAIN
フェーズとTEST
フェーズの間で変更されます:
_layer {
name: "bn1"
type: "BatchNorm"
bottom: "pool1"
top: "bn1"
batch_norm_param {
use_global_stats: false
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
param {
lr_mult: 0
}
include {
phase: TRAIN
}
}
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
}
include {
phase: TEST
}
}
_
カフェでどのようにuse _"BatchNorm"
_レイヤーを使うべきですか?
元のペーパーに従う場合、バッチの正規化の後には、スケールレイヤーとバイアスレイヤーが続く必要があります(バイアスを使用すると、バイアスパラメーターにアクセスできなくなりますが、バイアスを含めることができます)。 use_global_stats
もトレーニング(False)からテスト/デプロイメント(True)に変更する必要があります。これはデフォルトの動作です。最初に指定する例はデプロイメント用のprototxtなので、Trueに設定するのが正しいことに注意してください。
共有パラメーターについてはわかりません。
バッチの正規化でドキュメントを改善するためにプルリクエストを作成しましたが、変更したかったため閉じました。そして、私はそれに戻ることはなかった。
lr_mult: 0
ために "BatchNorm"
は不要になりました(おそらく許可されていませんか?)。ただし、対応するPRは今は見つかりません。
各BatchNormの後に、Caffeにスケールレイヤーを追加する必要があります。その理由は、Caffe BatchNormレイヤーは、入力データから平均を減算するだけであり、それらの分散で除算されますが、正規化された分布1をそれぞれスケーリングおよびシフトするγおよびβパラメーターは含まれません。逆に、Keras BatchNormalizationレイヤーには、上記のすべてのパラメータ。 Caffeでパラメーター「bias_term」をTrueに設定してスケールレイヤーを使用すると、Kerasバージョンの正確な動作を再現するための安全なトリックが提供されます。 https://www.deepvisionconsulting.com/from-keras-to-caffe/