注意力机制又火了!Attention+UNet 融合创新方案整理

2025深度学习发论文&模型涨点之—— Attention+UNet 

通过将注意力模块集成到UNet的架构中,可以动态地重新分配网络的焦点,使其更集中在图像中对于分割任务关键的部分。这样UNet可以更有效地利用其跳跃连接特性,以精细的局部化信息来提升分割精度。

以CAS-UNet算法为例,它通过引入跨融合通道注意机制、加性注意门模块和SoftPool池化模块,改进了传统的U-Net算法,提高了模型的分割能力和对细节图像区域的分割效果。在CHASEDB1和DRIVE数据集上的实验结果表明,CAS-UNet分别达到了96.68%和95.86%的准确率,以及83.21%和83.75%的灵敏度,优于现有的基于U-Net的经典算法。

我整理了一些 Attention+UNet【论文+代码】合集,需要的同学公人人人号【AI创新工场】自取。

论文精选

论文1:

NFMPAtt-Unet: Neighborhood Fuzzy C-means Multi-scale Pyramid Hybrid Attention Unet for medical image segmentation

基于邻域模糊C均值多尺度金字塔混合注意力Unet的医学图像分割

方法

多尺度动态权重特征金字塔模块(MDWFP):通过动态调整不同尺度的权重,增强网络对多尺度特征信息的捕获能力。

混合加权注意力机制(HWA):结合空间注意力和通道注意力,动态调整权重,

### 实现带有空间通道注意力机制UNet 为了实现具有空间通道注意力机制的空间注意U-Net,可以在原有的UNet架构基础上引入空间和通道维度上的自适应特征重加权模块。这种设计能够增强模型对于不同位置以及各个通道重要性的感知能力。 #### 空间通道注意力层定义 ```python import torch import torch.nn as nn class SpatialChannelAttention(nn.Module): def __init__(self, in_channels, reduction_ratio=16): super(SpatialChannelAttention, self).__init__() # Channel Attention Module self.channel_attention = nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1), nn.ReLU(inplace=True), nn.Conv2d(in_channels // reduction_ratio, in_channels, kernel_size=1), nn.Sigmoid() ) # Spatial Attention Module self.spatial_attention = nn.Sequential( nn.Conv2d(2, 1, kernel_size=7, padding=3), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() # Channel attention branch channel_att = self.channel_attention(x).expand_as(x) # Spatial attention branch max_pool = torch.max(x, dim=1)[0].unsqueeze(1) avg_pool = torch.mean(x, dim=1).unsqueeze(1) concat = torch.cat([max_pool, avg_pool], dim=1) spatial_att = self.spatial_attention(concat).expand_as(x) return x * channel_att * spatial_att ``` 此代码片段展示了如何构建一个融合了空间与通道注意力机制的新组件`SpatialChannelAttention`[^1]。该类继承自PyTorch中的`nn.Module`基类,并实现了两个主要部分:一个是用于捕捉全局上下文依赖关系的通道注意力模块;另一个则是专注于局部区域显著性度量的空间注意力模块。 #### 整合到UNet结构中 接下来,在标准UNet的基础上加入上述创建好的空间通道注意力层: ```python class SC_UNet(nn.Module): def __init__(self, num_classes=1, input_channels=3, depth=5, start_filts=64): super(SC_UNet, self).__init__() down_convs = [] up_convs = [] for i in range(depth): ins = input_channels if i == 0 else outs outs = start_filts*(2**i) pooling = True if i < depth-1 else False down_conv = DownConv(ins, outs, pooling=pooling) down_convs.append(down_conv) for i in reversed(range(depth - 1)): ins = outs outs = ins // 2 up_conv = UpConv(ins, outs) up_convs.append(up_conv) self.down_convs = nn.ModuleList(down_convs) self.up_convs = nn.ModuleList(up_convs) self.conv_final = conv1x1(start_filts, num_classes) self.sc_attns = nn.ModuleList([ SpatialChannelAttention(outs) for _ in range(depth)]) def forward(self, x): encoder_outs = [] for idx, module in enumerate(self.down_convs[:-1]): before_pool = module(x) encoder_outs.append(before_pool) sc_attn_output = self.sc_attns[idx](before_pool) x = F.relu(sc_attn_output) x = self.down_convs[-1](x) for idx, module in enumerate(self.up_convs): before_pool = encoder_outs[-(idx+1)] x = module(before_pool, x) sc_attn_output = self.sc_attns[len(encoder_outs)-idx-1](x) x = F.relu(sc_attn_output) x = self.conv_final(x) return x ``` 这段代码扩展了传统的UNet框架,通过在每一级编码器和解码器之间插入空间通道注意力层来提升性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值