Squeeze-and-Excitation Networks 的理解



SE-Block 主要是考虑到了不同通道之间所占的重要性可能不一样,而以前的网络中并没有考虑到这一点,而是把所有通道的重要性当成一样来处理的。

不同的通道的重要性是通过学到的一组权值来scale的,相当于经过加入权值进来之后,对原来的feature的一个重新的标定,具体的结构如下:


相当于先将input(h*w*c)沿着size方向经过Squeeze操作变成(1*1*c)的,

然后再经过Excitation这一步学到一个权重W,

最后根据学到的权重W 再经过scale操作变成(h*w*c)的output, 可以看出,input

和Output的shape是一样的,但是每个位置上的值却是经过重新标定的,实际上直观地看这个网络BLOCK 应该会提升性能,因为假设W是identity那么就是原来的情况,这里的思想个人感觉有点像Resduial里的想法,就是有一条路可以保证不变,然后另外一条路多少可以学到一些,所以得到的网络是有提升的,不过Resduial里面还有其他优点,比如可以避免因为网络过深而带来的梯度消失问题。

下面举例说明具体的情况。



左图是Inception中添加了SE-block之后的结构,右图是Residual添加了SE-block之后的结构,框右下角的数字是输出的shape,个人觉得之所以以这两个网络为例说明是因为目前一般会在网络的深度上和宽度上对网络进行设计,而这两个刚好是代表。

从Inception输出之后的shape是c * h*w, 

step1. 沿着size的方向作Global average pooling, 出来的shape 是c*1*1,

step2.经过一个FC层,出来的是(c/16, 1, 1),注意可以不是16,然后经过Relu,

  然后再经过一个FC层,再经过一个Sigmoid 层,output的shape是(c, 1, 1)这里没有注意顺序。这一步做完之后出来了c个weight,

step3. 根据上面得到的c个weight,分别scale之后作为最终的输出,这里的scale的意思是比如得到的是(0.1,0.2,0.7)那么就在对应的通道上乘上对应的weight.

欢迎指正!多谢! 

 

猜你喜欢

转载自blog.csdn.net/qfpkzheng/article/details/80383717
今日推荐