caffe各层解析以及参数说明(慢慢整理,做个笔记)

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/shanglianlm/article/details/84572758

本博客地址:https://blog.csdn.net/shanglianlm/article/details/84572758

  1. DummyData层
    产生随机测试数据
layer {
  type: 'DummyData'
  name: 'x'
  top: 'x'
  dummy_data_param {
    shape: { dim: 10 dim: 3 dim: 2 }
    data_filler: { type: 'gaussian' }
  }
}

Caffe中parameter filler的作用和类型
Fillers是caffe用特定算法随机生成的值来填充网络参数在blob里面的初始值。它只作用在参数的初始化阶段,与gpu无关的操作。
Constant : 令填充值x=0x=0
Uniform : 令填充值x∼U(a,b)x∼U(a,b)
Gaussian : 令填充值x=ax=a
PositiveUnitball : 令填充值x∈[0,1]x∈[0,1] ∀i∑jxij=1∀i∑jxij=1
Xavier :令填充值x∼U(−a,+a)x∼U(−a,+a); 其中 aa与输入节点,输出节点或着两者的均值成反比 (该算法是Bengio和Glorot 2010在Understanding the difficulty of training deep feedforward neuralnetworks里提出的)
MSRA : 令填充值x∼N(0,σ2)x∼N(0,σ2); 其中 aa与输入节点,输出节点或着两者的均值成反比 (该算法是Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun在Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification里提出的)
bilinear : 一般用在deconvolution 层做upsampling;例子如下:

layer {
  name: "upsample", type: "Deconvolution"
  bottom: "{{bottom_name}}" top: "{{top_name}}"
  convolution_param {
    kernel_size: {{2 * factor - factor % 2}} stride: {{factor}}
    num_output: {{C}} group: {{C}}
    pad: {{ceil((factor - 1) / 2.)}}
    weight_filler: { type: "bilinear" } bias_term: false
  }
  param { lr_mult: 0 decay_mult: 0 }
}

引用自:[Caffe]:关于filler typehttps://blog.csdn.net/cham_3/article/details/52765087

  1. Convolution层
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult:0
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    group: 3
    bias_term: true
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "msra"
    }
    engine: CAFFE
  }
}

lr_mult: 1 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍,能够加速收敛。
decay_mult: 1 权重衰减项,偏置,其衰减项一般设置为0
weight_filler : 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
bias_term : 是否开启偏置项,默认为true, 开启
bias_filler : 偏置项的初始化。一般设置为"constant",值全为0。
group : 分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。
engine: CAFFE 引擎CAFFE vs. cuDNN。Default就是指向caffe engine的。

  1. Pooling层
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}

pool: 池化方法,默认为MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC

  1. LRN(Local Response Normalization)层
layers {
  name: "norm1"
  type: LRN
  bottom: "pool1"
  top: "norm1"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}

local_size: 默认为5。如果是跨通道LRN,则表示求和的通道数;如果是在通道内LRN,则表示求和的正方形区域长度。
alpha: 默认为1,归一化公式中的参数。
beta: 默认为5,归一化公式中的参数。
norm_region: 默认为ACROSS_CHANNELS。有两个选择,ACROSS_CHANNELS表示在相邻的通道间求和归一化。WITHIN_CHANNEL表示在一个通道内部特定的区域内进行求和归一化。与前面的local_size参数对应。

  1. BatchNorm层
layer {
   name: "conv1_bn"
   type: "BatchNorm"
   bottom: "conv1"
   top: "conv1"
   batch_norm_param {
      use_global_stats: false
    }
 }

use_global_stats: false 在训练时要设置为false,代表需要批处理的均值方差要参考全局信息来更新。在测试时,要为true,代表不使用自己均值方差和全局的均值方差来得到批处理的均值和方差,而是使用全局均值方差,即训练好的均值方差。

  1. Scale层
    Scale层主要完成 top=alpha∗bottom+betatop=alpha∗bottom+beta的过程
Layer {
  name: "conv1_scale"
  bottom: "conv1"
  top: "conv1"
  type: "Scale"
  scale_param {
    filler {
      value: 1
    }
    bias_term: true
    bias_filler {
      value: 0
    }
  }
 }

caffe 中为什么bn层要和scale层一起使用
这个问题首先你要理解batchnormal是做什么的。它其实做了两件事。

  1. 输入归一化 x_norm = (x-u)/std, 其中u和std是个累计计算的均值和方差。
  2. y=alpha×x_norm + beta,对归一化后的x进行比例缩放和位移。其中alpha和beta是通过迭代学习的。
    那么caffe中的bn层其实只做了第一件事。scale层做了第二件事。
    这样你也就理解了scale层里为什么要设置bias_term=True,这个偏置就对应2)件事里的beta。
  1. ReLU层
layer {
  name: "conv1_relu"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}

在这里插入图片描述
7. dropout 层

layer {
	name: "drop1"
	type: "Dropout"
	bottom: "ip11"
	top: "ip11"
	dropout_param {
		dropout_ratio: 0.3
	}
}
  1. Split 层

  1. Flatten 层

  1. Reshape 层

  1. Concat 层
layer {
  name: "resx1_concat"
  type: "Concat"
  bottom: "resx1_match_conv"
  bottom: "resx1_conv3"
  top: "resx1_concat"
}

Concat 将多个bottom合并成一个top的过程。
将两个及以上的特征图按照在channel(建议)或num维度上进行拼接,一般都是channel上的拼接,并没有eltwise层的运算操作。如果说是在channel维度上进行拼接resx1_conv3和resx1_match_conv的话,首先除了channel维度可以不一样,其余维度必须一致(也就是num、H、W一致),这时候所做的操作仅仅是resx1_conv3 的channel k1加上resx1_match_conv的channel k2,Concat 层输出的blob可表示为:N*(k1+k2)HW。
实验表明,BN之后进行Concat操作,效果会更好。

  1. Slice 层
layer {
  name: "data_each"
  type: "Slice"
  bottom: "data_all"
  top: "data_classfier"
  top: "data_boundingbox"
  top: "data_facialpoints"
  slice_param {
    axis: 0
    slice_point: 150
    slice_point: 200
  }
}

与Concat层作用相反,它是将一个 bottom切分成多个top的过程。slice_point表示从哪里开切,即指定切分点。

延伸阅读:
caffe层解读系列——slice和concat实现MultiTask
https://blog.csdn.net/shuzfan/article/details/54565776

  1. InnerProduct 层

  1. ConvolutionDepthwise 层
    深度可分离卷积
layer {
  name: "resx1_match_DWconv"
  type: "ConvolutionDepthwise"
  bottom: "pool1"
  top: "resx1_match_DWconv"
  convolution_param {
    num_output: 24
    kernel_size: 5
    stride: 2
    pad: 1
    bias_term: false
    weight_filler {
      type: "msra"
    }
  }
}

延伸阅读:
caffe深度学习【十七】配置MobileNet,caffe添加ConvolutionDepthwise层
https://blog.csdn.net/qq_38451119/article/details/82663649

  1. ShuffleChannel 层(Shufflenet特有)
layer {
  name: "shuffle2"
  type: "ShuffleChannel"
  bottom: "resx2_conv1"
  top: "shuffle2"
  shuffle_channel_param {
    group: 3
  }
}

在分组卷积的基础上,打乱不同通道的排序,使得下一层的操作的输入能吸收来上一层不同组的内容,使得学习更佳均衡。

延伸阅读:
caffe深度学习【十六】配置Shufflenet v1,caffe添加shuffle_channel_layer层
https://blog.csdn.net/qq_38451119/article/details/82657510

  1. Eltwise 层
layer {
  name: "resx2_elewise"
  type: "Eltwise"
  bottom: "resx1_concat"
  bottom: "resx2_conv3"
  top: "resx2_elewise"
  eltwise_param {
    operation: SUM
  }
}

Eltwise层的操作有三个:product(点乘), sum(相加减) 和 max(取大值),其中sum是默认操作。
如果实现A-B,则eltwise_param 为:

eltwise_param {
    operation: SUM
    coeff: 1
    coeff: -1
  }

猜你喜欢

转载自blog.csdn.net/shanglianlm/article/details/84572758
今日推荐