从零开始,一步一步学习caffe的使用,期间贯穿深度学习和调参的相关知识!
layer {
name: "norm1"
type: "LRN"
bottom: "conv1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
LRN
操作主要目的是在深度上进行平滑操作,使得数据在深度层面上有一定的联系。
LRN
层是在AlexNet
网络中提出来的,但是因为其计算的复杂度和后期的效果并不理想,在后面的网络中基本上抛弃的LRN的归一化方法。
layer {
bottom: "conv1"
top: "conv1"
name: "bn_conv1"
type: "BatchNorm"
batch_norm_param {
use_global_stats: true
}
}
layer {
bottom: "conv1"
top: "conv1"
name: "scale_conv1"
type: "Scale"
scale_param {
bias_term: true
}
}
message BatchNormParameter {
// 如果为真,则使用保存的均值和方差,否则采用滑动平均计算新的均值和方差。
// 该参数缺省的时候,如果是测试阶段则等价为真,如果是训练阶段则等价为假。
optional bool use_global_stats = 1;
// 滑动平均的衰减系数,默认为0.999
optional float moving_average_fraction = 2 [default = .999];
// 分母附加值,防止除以方差时出现除0操作,默认为1e-5
optional float eps = 3 [default = 1e-5];
}
在深度神经网络的训练过程中,先前层参数的调整会导致之后每一层输入值的分布发生变化,这种现象会使得模型的训练变得复杂。因为分布均匀且统一的数据往往更加容易使得算法训练出高准确率的模型。Batch Norm
主要借鉴的是白化的思想,目的是将数据尽量维持在方差为1,均值为0的分布上。因为数据的总量十分庞大,我们无法计算出整个数据集的均值与方差,因此采用Batch的思想,分块的进行白化处理,Batch Norm
的精华体现在最后一个公式上,白化之后进行拉伸与平移,也就是对数据分布进行修正。并且拉伸与平移的系数是通过训练得到的,这样,我们将batch
在整个数据集的整体分布状态也学习了出来,防止以偏概全!下图可以清晰的看出,加入Batch Norm
使得每一层的数据更够有效且均匀的传递到下一层中去。
Batch Norm
在ResNet
网络和Inception-v2
、Inception-v3
、Inception-v4
中均有用到。
批标准化 (Batch Normalization) https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-08-batch-normalization/