学堂 学堂 学堂公众号手机端

local注意力怎么生成

lewis 1年前 (2024-04-07) 阅读数 6 #技术

这篇文章主要介绍了local注意力怎么生成的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇local注意力怎么生成文章都会有所收获,下面我们一起来看看吧。

soft attention(包括空间注意力、通道注意力)软注意学习的目的是选择细粒度的重要像素点,它们是pixel级。

hard attention( local 注意力) 硬注意学习则致力于搜索粗糙的潜在判别区域,它们是region级。
他们在功能上有很大的互补性。他们的结合使用可以提高模型的性能


下面讲解空间注意力、通道注意力、local 注意力的生成

通道注意力:
就是对于每个channel赋予不同的权重,比如1,2处马的形状比较明显,所以理所当然,对1,2通道的权重比较大,3,4处权重小。

空间注意力:
空间注意力是对64个通道进行mean的一个操作,得到一个(w x h)的权重,mean的操作就学到了所有通道的整体分布,而抛弃了奇异的通道。比如说1,2的图可以很好的描绘出马的形状,而3,4就不行(但本质上它也是要显示出马的形状),但是通过mean后,得到的w x h权值共享后,给了3,4一定的权值描述,相当于给3,4一定的注意力,这样它们也可以描绘出马的形状。

代码

classSpatialAttn(nn.Module):#输入x.shape=(32,3,256,128),对第三维度通道求mean=(32,1,256,128),一个卷积照片缩小一半,upsample恢复,再经过1x1convdef__init__(self):super(SpatialAttn,self).__init__()self.conv1=ConvBlock(1,1,3,s=2,p=1)self.conv2=ConvBlock(1,1,1)defforward(self,x):#globalcross-channelaveragingx=x.mean(1,keepdim=True)#x.shape=(32,3,256,128)x.mean.shape按照通道求均值=(32,1,256,128)#3-by-3convx=self.conv1(x)#x.shape=(32,1,128,64)#bilinearresizingx=F.upsample(x,(x.size(2)*2,x.size(3)*2),mode='bilinear',align_corners=True)#x.shape=(32,1,256,128)#scalingconvx=self.conv2(x)#x.shape=(32,1,256,128)returnxclassChannelAttn(nn.Module):def__init__(self,in_channels,reduction_rate=16):super(ChannelAttn,self).__init__()assertin_channels%reduction_rate==0self.conv1=ConvBlock(in_channels,in_channels//reduction_rate,1)self.conv2=ConvBlock(in_channels//reduction_rate,in_channels,1)defforward(self,x):#squeezeoperation(globalaveragepooling)#x.shape=(32,16,256,128)x=F.avg_pool2d(x,x.size()[2:])#torch.size([32,16,1,1])#excitationoperation(2convlayers)x=self.conv1(x)#torch.size([32,1,1,1])x=self.conv2(x)#torch.size([32,16,1,1])returnxclassSoftAttn(nn.Module):#软注意力(32,16,256,128)=空间注意力的输出(32,1,256,128)乘上通道注意力(32,16,1,1)def__init__(self,in_channels):super(SoftAttn,self).__init__()self.spatial_attn=SpatialAttn()self.channel_attn=ChannelAttn(in_channels)self.conv=ConvBlock(in_channels,in_channels,1)defforward(self,x):#x.shape(32,16,256,128)y_spatial=self.spatial_attn(x)#32,1,256,128y_channel=self.channel_attn(x)#32,16,1,1y=y_spatial*y_channel#32,16,256,128y=F.sigmoid(self.conv(y))returny#torch.Size([32,16,256,128])

关于“local注意力怎么生成”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“local注意力怎么生成”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注博信行业资讯频道。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门