batch-normalization算法导致的算法不收敛问题

最近在VGG11网络上使用batch-norm算法,可以明显的加速收敛和提升精度。但是修改网络结构:比如将最后一层pooling由average pooling,改为max pooling后,算法在头10次迭代左右就开始发散,loss由初始的9.0左右增加到80左右。观察bn层的输入与输出发现,bn会对输出值进行一定程度的放大,可能是这一点导致了算法的发散。目前尝试了gradient-clip 、adagrad和adam等算法以及降低学习率的策略,都没有很好的解决该问题。大家有没有遇到类似的问题,或者有什么好的建议?
已邀请:

szus2016

赞同来自: Huaijin nesciemus

BN后面有Scale吗?
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层的设定一般是按照conv->bn->scale->relu的顺序来形成一个block。
关于bn,有一个注意点,caffe实现中的use_global_stats参数在训练时设置为false,测试时设置为true。
因为在训练时bn作用的对象是一个batch_size,而不是整个训练集,如果你没有将其设置为false,则有可能造成bn后数据更加偏离中心点,导致nan或87.3365的问题。所以你可以尝试一下修改这个参数。

ChrisYann - 低级算法工程师

赞同来自:

根据你的描述,应该跟你的优化算法和学习率调节关系不大,我觉得可能的问题是BN层放的位置不对。一般顺序是convolution->BN->relu ... ->convolution->BN->relu。pool后则不加。你是不是在relu之后加了BN?

moonlit20

赞同来自:

问题解决了吗?最近用caffe训练带有batchnorm layer的网络都不成功。

yuchiwang

赞同来自:

请问bn能放在全连接层后面吗

要回复问题请先登录注册