Caffe 学习:Eltwise层和Concat层区别

在caffe里搭建网络时,当两个通道连接到一块时,经常会遇到Eltwise层和Concat层,这两层有什么区别和联系呢

一、Concat层

Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9的话,首先除了channel维度可以不一样,其余维度必须一致(也就是num、H、W一致),这时候所做的操作仅仅是conv_9 的channel k1加上deconv_9的channel k2,Concat 层输出的blob可表示为:N*(k1+k2)*H*W。通常情况下,考虑到Concat是希望将同大小的特征图拼接起来,那为什么会产生同大小的特征图呢?显然离不开上采样和下采样的操作,接下来,以Caffe为例,介绍一下这两种拼接的方式,如下:

  • 选择axis=0,表示在num维度上进行拼接,可表示为:(k1+k2)*C*H*W;

  • 选择axis=1,表示在channel维度上进行拼接,可表示为:N*(k1+k2)*H*W。

二、Eltwise层

Eltwise层的操作有三个:product(点乘), sum(相加减) 和 max(取大值),其中sum是默认操作(注意与concat的区别:要求4个维度的输入必须一样)。 

      1. PROD:按元素乘积 
      2. SUM:按元素求和(默认) 
      3. MAX:保存元素大者

      该层还定义了 coeff 参数,该参数只对SUM操作起作用。

最后,caffe还设定了stable_prod_grad #[default = true ] 来选择是否渐进较慢的梯度计算方法,该方法只适用于PROD操作,对SUM操作无效。 
更多细节参见下面的源码。

假设输入(bottom)为A和B,如果要实现element_wise的A+B,即A和B的对应元素相加,prototxt文件如下:

 

layer 
{
  name: "eltwise_layer"
  type: "Eltwise"
  bottom: "A"
  bottom: "B"
  top: "diff"
  eltwise_param {
    operation: SUM
  }
}​

  如果实现A-B,则prototxt为:

layer
{
name: "eltwise_layer"
type: "Eltwise"
bottom: "A"
bottom: "B"
top: "diff"
eltwise_param {
operation: SUM
coeff: 1
coeff: -1
}
}​

  其中A和B的系数(coefficient)都要给出!

你可能感兴趣的:(深度学习)