本文正在参与「金石计划 . 瓜分6万现金大奖」
作者简介:秃头小苏,致力于用最浅显的言语描绘问题
专栏推荐:深度学习网络原理与实战
近期方针:写好专栏的每一篇文章
支持小苏:点赞、保藏⭐、留言
SENet原理详解
先来简略说说咱们为什么需求运用注意力机制,这是由于咱们希望网络能够专注于一些更加重要的东西,这对物体的识别定位都大有益处。enmmm,是不是够简略呢。假如你是第一次学习注意力机制,我觉得你会充溢疑惑,怎么让网络注意到一些更加重要的东西呢?那么带着疑问,和我一起来看看SENet的原理,等我介绍完后看你能否了解喔。
话不多说,咱们直接来看SENet的关键结构,如下图所示:

咱们来介绍一下上图的网络,首先是输入X,其维度为H′W′C′{\rm{H’ \times W’ \times C’}},通过一系列卷积等维度改变操作后得到特征图U,其维度HWCHWC。【注:其实从特征图U开端向后才是真实的SENet的结构,这一步转换仅仅一些特征图维度改变】 当咱们得到U后,会先将U通过大局平均池化的操作,行将U的维度由HWCHWC变成11C11C,此步骤对应着上图中的Fsq(⋅){F_{sq}}( \cdot )。接着会履行步骤Fex(⋅,W){F_{ex}}( \cdot ,W),此步骤包括两个全衔接层已经两个激活函数,为便利咱们了解,做此进程的图如下:

从上图咱们能够看出,在第一次全衔接层后咱们运用Relu激活函数,此时得到的输出维度为11C′′1 \times 1 \times {\rm{C”}},通常情况下C′′{\rm{C”}}设置为CC的14\frac{1}{4}。第二个全衔接层后运用Sigmoid函数,将每层数值归一化到0-1之间,以此表示每个通道的权重,第二个全衔接的输出也为11C11C。得到了终究11C11C的输出后,咱们将U和刚刚得到的11C11C输出相乘,得到终究的特征图X~{{\rm{\tilde X}}},终究特征图X~{{\rm{\tilde X}}}的维度和U一致,为HWCHWC。
介绍到这儿,咱们是否明白了呢。假如你还没明白的话,再来看下图吧!!!首先下图左上角表示为两个通道的特征图,经平均池化后得到左下角的图;再次通过两次全衔接层和激活函数后,转化成了右下角的图,终究用右下角的0.5、0.6别离乘原始的特质图,则得到终究的右上角的图。能够发现通过SENet特征图输入前后尺度没有改变,其值发生改变。

SENet代码详解
了解了上文所述的SENet原理,那么编写SENet的代码就十分简略了,如下:
def SENet(input):
#大局平均池化
x = nn.AdaptiveAvgPool2d((1,1))(input)
x = x.view(1, -1)
#第一个全衔接层
x = nn.Linear(2, 1)(x)
x = nn.functional.relu(x)
#第二个全衔接层
x = nn.Linear(1, 2)(x)
x = nn.functional.sigmoid(x)
return x
if __name__ == '__main__':
input = torch.ones(1, 2 ,2 ,2)
output = SENet(input)
# 将SENet的输出维度进行改变,以便后边的乘机操作
output = output.view(input.shape[0], input.shape[1],1, 1)
SE_output = input*output
print(input)
print(input.shape)
print(output)
print(output.shape)
print(SE_output)
咱们能够来看一下上述代码的输出,如下:
input:

output:

SE_output:

你能够结合理论部分,再对照这些输出看看是否一致喔。【注意:咱们需求注意在终究一步相乘操作前需求先View一下输出output的尺度,不然乘的成果不一样哦,这涉及到一些pytorch乘法的操作,这部分我也调试了好久,咱们能够动手试试看。】
如若文章对你有所帮助,那就
