from Eltwise层解析 - greathuman - 博客园
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那么明显,但是训练和测试速度相对快了一点,所以应用时更看如何权衡两者能不能满足自己项目的需求。
我们都在通往真理的路上。
from Caffe 学习:Eltwise层和Concat层区别_qq_23304241的博客-CSDN博客
在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)都要给出!
————————————————
版权声明:本文为CSDN博主「qq_23304241」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23304241/article/details/82414569


868

被折叠的 条评论
为什么被折叠?



