空间注意力网络(Spatial Attention Neural Network, SANN)把空间注意力机制嵌进 CNN,在处理时序数据时能动态聚焦关键片段。我在 UCI HAR 数据集上跑了一把,96.31% 准确率,单次推理 1.61ms,轻量又能打。
为什么需要空间注意力
普通 CNN 处理多通道时序数据时,每个时刻、每个通道的特征都给一样的权重。实际上,重要的模式只在某些时间窗出现,噪声却无处不在。尤其像加速度计、陀螺仪这类传感器数据,静态姿势和动态动作的差异往往集中在几个关键区间,一视同仁地卷积等于浪费计算。
我最初直接用纯 CNN 跑 UCI HAR,验证集卡在 92% 左右死活上不去,仔细看了混淆矩阵,发现 Standing 和 Sitting 这两个静态类经常互相误分 —— 它们的信号本来就平坦,CNN 抓不住细微的波动。所以我想,如果让网络自己学会'看哪里',也许能改善这类问题。空间注意力刚好就是这个思路。
核心模块:SpatialAttentionModule
SANN 的创新点全在一个轻量的空间注意力模块里。代码很简单:
class SpatialAttentionModule(nn.Module):
def __init__(self):
super().__init__()
self.att_fc = nn.Sequential(
nn.Conv2d(1, 1, (3, 1), (1, 1), (1, 0)),
nn.Sigmoid()
)
def forward(self, x):
# x: [batch, channel, series, modal]
att = torch.mean(x, dim=1, keepdim=True) # 通道压缩
att = self.att_fc(att) # 生成空间权重
out = x * att
return out

设计上有几个考量:
- 通道取平均压缩:把多通道信息压成一张二维空间图,再在上面学权重。省参数,也避免通道维度的干扰。
- 只在时序轴做注意力:因为输入的 shape 是 [batch, channels, series, modal],我把卷积核设成
(3,1),只在 series 维度滑动,modal 维度保持不变。这是因为传感器数据的模态轴(比如三轴加速度)天然就有物理意义,强行卷积可能会破坏空间结构。



