【网络结构】注意力机制Attention block

注意力机制源于自然语言处理,CSDN:https://blog.csdn.net/qq_40027052/article/details/78421155#t0

视觉注意力机制中接触到的,自认为应用较多的,也是在论文中频繁出现的:

channel-wise attention(通道注意力)

spital attention(视觉空间注意力)

刚接触注意力机制时总把这两个弄混,一直不知道如何实现,过一段时间再看才发现是两个东西,实现起来也不麻烦。

1.channel-wise attention(通道注意力)

可以参考Squeeze-and-Excitation Networks(SENet),这个结构是2017 ILSVR竞赛的冠军,主要是区分不同通道特征的重要性,重要特征权重大,不重要特征权重小,权重部分计算部分通过Squeeze-and-Excitation Networks实现。

具体是将WHC的特征通过全局池化、全连接和激活函数得到1*1*C的特征(即权重),将1*1*C的权重与WHC特征乘积得到通道注意力的特征。

具体实现:

https://blog.csdn.net/wangkun1340378/article/details/79092001

https://zhuanlan.zhihu.com/p/32702350

代码容易实现,可以尝试一下,会因为全连接增加参数量,但不会太多,因为SENet中直接对特征进行了求全局平均,将W*H的特征变成了一个数,再再这个基础上进行全连接计算,因此不会增加太多参数量和计算量。

针对通道注意力机制在处理类不平衡或是多尺度问题中表现如何,或是更适合哪种场景,希望路过的大佬有了解的可以解答一下,万分感谢!!

2.spital attention(视觉空间注意力)

与通道注意力不同,更关注位置信息。在这里对通道进行池化计算,得到WH的特征,经过变换得到两个WH的矩阵,经过计算得到位置注意力权重,再与WHC的特征相乘,得到具有位置注意力信息的特征。

具体变换方法多种,可参考:

图像分割的双注意力机制:https://zhuanlan.zhihu.com/p/54150694

用于卷积神经网络的注意力机制(Attention)----CBAM: Convolutional Block Attention Modul :https://www.jianshu.com/p/4fac94eaca91

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
CA(Coordinate Attention注意力机制是一种轻量级的注意力机制,可以用于卷积神经网络中。它通过对特征图的坐标信息进行建模,来增强特征图的表达能力。下面是一个使用CA注意力机制网络结构的示例代码: ```python import torch import torch.nn as nn class CA_Block(nn.Module): def __init__(self, in_channels, reduction_ratio=16): super(CA_Block, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_channels, in_channels // reduction_ratio, 1, bias=False) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Conv2d(in_channels // reduction_ratio, in_channels, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) * x class CA_Net(nn.Module): def __init__(self, num_classes=10): super(CA_Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(64) self.ca1 = CA_Block(64) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(128) self.ca2 = CA_Block(128) self.conv3 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1, bias=False) self.bn3 = nn.BatchNorm2d(256) self.ca3 = CA_Block(256) self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Linear(256, num_classes) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.ca1(x) x = nn.functional.relu(x) x = nn.functional.max_pool2d(x, 2) x = self.conv2(x) x = self.bn2(x) x = self.ca2(x) x = nn.functional.relu(x) x = nn.functional.max_pool2d(x, 2) x = self.conv3(x) x = self.bn3(x) x = self.ca3(x) x = nn.functional.relu(x) x = self.avg_pool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x ``` 在这个网络结构中,CA_Block是CA注意力机制的实现,CA_Net是整个网络的结构。其中,CA_Block包含了两个分支,一个是对特征图进行平均池化,另一个是对特征图进行最大池化,然后将两个分支的结果相加,再通过一个sigmoid函数进行归一化,最后与原始特征图相乘得到增强后的特征图。在CA_Net中,每个卷积层后面都跟着一个CA_Block,用于增强特征图的表达能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值