一文看懂SENet和SKNet(附代码)

### SE-Net的主要特性 #### Squeeze-and-Excitation Networks (SE-Nets) SE-Nets引入了一种新颖的方法来重新校准通道上的特征响应。这种机制允许网络自适应地关注重要的特征并抑制不那么有用的特征[^1]。 具体来说,在传统的卷积操作之后,SE模块会执行两个主要的操作:“挤压”(squeeze)“激励”(excitation)。“挤压”是指全局池化操作,用于获取每个通道的空间信息汇总;而“激励”则是指通过全连接层构建的门控机制,该机制可以为每个通道分配权重,从而实现对原始特征图的有效加权组合。 ```python class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) ``` #### Selective Kernel Networks (SK-Nets) 相比之下,SK-Nets专注于解决多尺度问题,并提出了一个更灵活的选择性内核单元(SK unit),它可以动态选择最合适的卷积核尺寸以更好地捕捉输入数据的不同尺度的信息[^3]。 在SK单元内部,首先计算多个分支下的候选表示形式——这些分支对应于不同的卷积核大小(例如3×3、5×5)。接着利用融合策略将它们结合起来形成最终输出之前的一个注意力向量z,这个向量决定了各个分支的重要性程度。最后,根据得到的关注度分布调整各路径贡献的比例,进而完成整个过程中的尺度选择功能[^4]。 ```python import torch.nn.functional as F def sk_conv(input_tensor, channels, M, r, L=32): batch_size, C, H, W = input_tensor.shape # Split and Convolutional Layers with different kernel sizes. split_tensors = [] for i in range(M): temp_layer = nn.Conv2d(C, channels, kernel_size=(i*2)+3, stride=1, padding=i+1)(input_tensor) split_tensors.append(temp_layer) U = sum(split_tensors) s = F.adaptive_avg_pool2d(U, output_size=(1, 1)) z = nn.Conv2d(channels, channels//r, kernel_size=1)(s) z = nn.BatchNorm2d(channels//r)(z) z = nn.ReLU()(z) attention_vectors = [] for i in range(M): vector_i = nn.Conv2d(channels//r, channels, kernel_size=1)(z) attention_vectors.append(vector_i) attention_vectors = torch.stack(attention_vectors, dim=-1) attention_vectors = F.softmax(attention_vectors, dim=-1) V = 0 for i in range(M): V += split_tensors[i]*attention_vectors[:,:,:,i].unsqueeze(-1) return V ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值