zoukankan      html  css  js  c++  java
  • Eltwise层解析

    Concat层虽然利用到了上下文的语义信息,但仅仅是将其拼接起来,之所以能起到效果,在于它在不增加算法复杂度的情形下增加了channel数目。那有没有直接关联上下文的语义信息呢?答案是Eltwise层,被广泛使用,屡试不爽,并且我们常常拿它和Concat比较,所以我常常一起说这两个层。我们普遍认为,像这样的“encoder-decoder”的过程,有助于利用较高维度的feature map信息,有利于提高小目标的检测效果。

    Eltwise层有三种类型的操作:product(点乘)、sum(求和)、max(取最大值),顾名思义,sum就是把bottom的对应元素相加,product就是对应相乘,max就是对应取最大,其中sum为默认操作。根据eltwise_layer.cpp的源码可见,eltwise层要求对应bottom层的blob一致,这才能是对应元素嘛。得到的结果top层的blob和bottom层一致,这个过程想象成三维的过程很好理解。

    template <typename Dtype>
    void EltwiseLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom,
          const vector<Blob<Dtype>*>& top) {
      for (int i = 1; i < bottom.size(); ++i) {
        CHECK(bottom[i]->shape() == bottom[0]->shape());
      }
      top[0]->ReshapeLike(*bottom[0]);
      // If max operation, we will initialize the vector index part.
      if (this->layer_param_.eltwise_param().operation() ==
          EltwiseParameter_EltwiseOp_MAX && top.size() == 1) {
        max_idx_.Reshape(bottom[0]->shape());
      }
    }

    至于书写应用格式嘛,看看resnet。

    layer {
        bottom: "res2a_branch1"
        bottom: "res2a_branch2c"
        top: "res2a"
        name: "res2a"
        type: "Eltwise"
    }
    layer {
        bottom: "res5a_branch1"
        bottom: "res5a_branch2c"
        top: "res5a"
        name: "res5a"
        type: "Eltwise"
    }

    这个书写的次序可能看着有点不舒服,但不影响使用。上面都是使用的默认sum的Eltwise。

    如果需要指定操作,就应该这样:

    layer {
        name: "res2b1"
        type: "Eltwise"
        bottom: "pool1"
        bottom: "res2b1_branch2b"
        top: "res2b1"
        eltwise_param{
            operation:SUM //operation:PROD或者operation:MAX
    } }

    另外,如果要实现相减,类似也可以实现其它的加权求和或相减,例如:

    layer 
    {
      name: "res2b1"
      type: "Eltwise"
      bottom: "pool1"
      bottom: "res2b1_branch2b"
      top: "res2b1"
      eltwise_param {
        operation: SUM
        coeff: 1
        coeff: -1
      }
    }​

    注意coeff参数只对sum起作用,并且有多少个bottom就有多少个coeff。

    总结:虽然上面说了这么多,但是sum操作仍然是我们用的最多的。效果上,Eltwise因为更直接的利用了上下文信息,所以精度提高,但是Eltwise的操作却增加了算法耗时,而Concat层虽然提高的精度没有Eltwise那么明显,但是训练和测试速度相对快了一点,所以应用时更看如何权衡两者能不能满足自己项目的需求。

  • 相关阅读:
    吴裕雄--天生自然 R语言开发学习:广义线性模型(续一)
    吴裕雄--天生自然 R语言开发学习:广义线性模型
    吴裕雄--天生自然 R语言开发学习:重抽样与自助法(续一)
    吴裕雄--天生自然 R语言开发学习:重抽样与自助法
    吴裕雄--天生自然 R语言开发学习:中级绘图(续二)
    吴裕雄--天生自然 R语言开发学习:中级绘图(续一)
    吴裕雄--天生自然 R语言开发学习:中级绘图
    吴裕雄--天生自然 R语言开发学习:功效分析(续一)
    吴裕雄--天生自然 R语言开发学习:功效分析
    吴裕雄--天生自然 R语言开发学习:方差分析(续二)
  • 原文地址:https://www.cnblogs.com/cvtoEyes/p/8624725.html
Copyright © 2011-2022 走看看