一、注意力机制
产生背景: 大数据时代,有很多数据提供给我们。对于人来说,可以利用重要的数据,过滤掉不重要的数据。那对于模型来说(CNN、LSTM),很难决定什么重要、什么不重要,因此,注意力机制产生了。
注意力机制——把焦点聚焦在比较重要的事物上。
原理:
看查询对象Q和被查询对象K的相似度。
一般使用点乘的方式。点乘其实就是求内积。
Q,K = k1,k2,k3 … …
通过点乘,计算Q和K里的每一个事物的相似度,拿到Q和k1的相似值s1,Q和k2的相似值s2 。。。
做一层softmax(s1,s2,...,sn)
就可以得到概率a1,a2,…,an
(进而就可以找出哪个对Q更重要)
那么a就代表数据的权重,v是数据本身,a*v就是处理之后的数据。
注意力机制教程
二、CA注意力机制
产生背景: 现有的注意力机制其通道的处理一般是采用全局最大池化/平均池化,这样会损失掉物体的空间信息。
优势: CA注意力机制可以把位置信息嵌入到通道注意力中。
注:图中第三行r是一个缩减系数,可以减少整个注意力机制的参数量。
P2 在pytorch中如何实现
attention.py中的forward部分如下
def forward(self,x): # x的参数有 batch_size, c, h, w_, _, h, w = x.size()# batch_size, c, h, w => batch_size, c, h, 1 => batch_size, c, 1, h x_h = torch.mean(x, dim = 3, keepdim = True).permute(0,1,3,2) #提取高方向上的信息。# mean压缩,压缩第三个维度的值,也就是给w的值变成1。permute调换维度顺序。x_w = torch.mean(x, dim = 2, keepdim = True)# batch_size, c, 1, w cat batch_size, c, 1, h => batch_size , c, 1, w+h# batch_size , c, 1, w+h => batch_size, c/r, 1, w+hx_cat_conv_relu = self.relu(self.bn(self.conv_1x1(torch.cat((x_h, x_w), 3))))# batch_size, c/r, 1, w+h => batch_size, c/r, 1, h 和 batch_size, c/r, 1, wx_cat_conv_split_h, x_cat_conv_split_w = x_cat_conv_relu([h,w],3)# batch_size, c/r, 1, h =>batch_size, c/r, h, 1 => batch_size, c, h, 1s_h = self.sigmoid_h(self.F_h(x_cat_conv_split_h.permute(0,1,3,2)))s_w = self.sigmoid_h(self.F_h(x_cat_conv_split_w)#s_h 在宽方向上拓展回来,s_w同理out = x*s_h.expand_as(x)*s_w.expand_as(x)return out
P3 如何在网络中应用也还没学,挖坑
CA注意力机制教程