Caffe--xavier初始化方法

xavier是从[-scale, +scale]中进行均匀采样,对卷积层或全连接层中参数进行初始化的方法。
其中scale = \sqrt(3 / n), n根据不同实现可设置为n=(num_in + num_out) / 2 (Understanding the difficulty of training deep feedforward neural networks ),或n=num_out (caffe最初实现方法)。
我们来看一下caffe中具体是怎样实现的,代码位于include/caffe/filler.hpp文件中。
template
class XavierFiller : public Filler {
public:
explicit XavierFiller(const FillerParameter& param)
: Filler(param) {}
virtual void Fill(Blob* blob) {
CHECK(blob->count());
int fan_in = blob->count() / blob->num();
int fan_out = blob->count() / blob->channels();
Dtype n = fan_in; // default to fan_in
if (this->filler_param_.variance_norm() ==
FillerParameter_VarianceNorm_AVERAGE) {
n = (fan_in + fan_out) / Dtype(2);
} else if (this->filler_param_.variance_norm() ==
FillerParameter_VarianceNorm_FAN_OUT) {
n = fan_out;
}
Dtype scale = sqrt(Dtype(3) / n);
caffe_rng_uniform(blob->count(), -scale, scale,
blob->mutable_cpu_data());
CHECK_EQ(this->filler_param_.sparse(), -1)
<< "Sparsity not supported by this Filler.";
}
};

由上面可以看出,caffe的Xavier实现有三种选择

(1) 默认情况,方差只考虑输入个数:
这里写图片描述
(2) FillerParameter_VarianceNorm_FAN_OUT,方差只考虑输出个数:
这里写图片描述
(3) FillerParameter_VarianceNorm_AVERAGE,方差同时考虑输入和输出个数:
这里写图片描述

你可能感兴趣的:(Caffe)