sknet和senet
时间: 2025-01-08 08:11:23 浏览: 5
### 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
```
阅读全文