batch-normalization算法导致的算法不收敛问题
最近在VGG11网络上使用batch-norm算法,可以明显的加速收敛和提升精度。但是修改网络结构:比如将最后一层pooling由average pooling,改为max pooling后,算法在头10次迭代左右就开始发散,loss由初始的9.0左右增加到80左右。观察bn层的输入与输出发现,bn会对输出值进行一定程度的放大,可能是这一点导致了算法的发散。目前尝试了gradient-clip 、adagrad和adam等算法以及降低学习率的策略,都没有很好的解决该问题。大家有没有遇到类似的问题,或者有什么好的建议?
5 个回复
szus2016
赞同来自: Huaijin 、nesciemus
Conv→BN→Scale→Relu...Conv→BN→Scale→Relu
参考 https://github.com/KaimingHe/deep-residual-networks/blob/master/prototxt/ResNet-152-deploy.prototxt
layer {
bottom: "data"
top: "conv1"
name: "conv1"
type: "Convolution"
convolution_param {
num_output: 64
kernel_size: 7
pad: 3
stride: 2
b ias_term: false
}
}
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
}
}
layer {
top: "conv1"
bottom: "conv1"
name: "conv1_relu"
type: "ReLU"
}
Francis_ZHOU - 95后学生
赞同来自: xinmiao 、slaenig
关于bn,有一个注意点,caffe实现中的use_global_stats参数在训练时设置为false,测试时设置为true。
因为在训练时bn作用的对象是一个batch_size,而不是整个训练集,如果你没有将其设置为false,则有可能造成bn后数据更加偏离中心点,导致nan或87.3365的问题。所以你可以尝试一下修改这个参数。
ChrisYann - 低级算法工程师
赞同来自:
moonlit20
赞同来自:
yuchiwang
赞同来自: