VisionTransformer(ViT)在时间序列行为识别中的应用

举报
是Dream呀 发表于 2025/08/14 14:31:52 2025/08/14
【摘要】 VisionTransformer(ViT)在时间序列行为识别中的应用

VisionTransformer(ViT) 是一种基于Transformer架构的创新模型,近年来在计算机视觉领域掀起了不小的波澜。它通过引入多头自注意力机制(Multi Self-Attention),抛弃了传统卷积神经网络(CNN)的局部特征提取方式,转而以全局视角处理图像数据。

一、VisionTransformer的基础原理

1. 传统卷积的瓶颈与挑战

传统卷积神经网络(CNN)在图像处理中长期占据主导地位,但随着任务复杂度和数据规模的增加,它的局限性逐渐显现:

  • 计算效率低下:卷积操作需要对每个通道进行全局交互,参数量和计算量随着通道数的增加呈爆炸式增长,特别是在深层网络中,这会导致训练和推理耗时严重,GPU显存占用高。
  • 局部感知限制:CNN通过局部感受野提取特征,虽然高效,但难以直接捕捉图像中的长距离依赖关系或全局信息。
  • 灵活性不足:CNN的结构设计通常针对特定任务优化,迁移到其他任务或数据类型时,往往需要大幅调整。

这些问题促使研究者寻找新的解决方案,而VisionTransformer正是这一背景下诞生的产物。

2. VisionTransformer的核心机制

VisionTransformer的核心在于将Transformer架构从自然语言处理领域迁移到计算机视觉。它通过多头自注意力机制(Multi Self-Attention)处理图像数据,具体流程可以概括为以下几个步骤:

  • 图像分块(Patch分割):将输入图像分割成多个固定大小的小块(patches),类似于把一张大图剪成小拼图。
  • 嵌入转换:将每个patch展平成一维向量,并通过线性变换映射到高维空间,形成特征嵌入(embedding)。
  • 位置编码:为每个patch的嵌入添加位置信息,以保留图像的空间结构。
  • 多头自注意力处理:利用Transformer的编码器,通过多头自注意力机制捕捉patches之间的全局依赖关系。
  • 分类预测:将处理后的特征输入分类头,完成任务(如图像分类)。

这种机制完全跳过了传统卷积的局部操作,直接从全局角度理解图像内容,为视觉任务提供了一种全新的思路。

3. VisionTransformer的技术优势

VisionTransformer相较于传统CNN展现出了显著的优势:

  • 全局感知能力:通过自注意力机制,模型可以在处理图像时关注到所有patches之间的关系,轻松捕捉全局信息。
  • 轻量化潜力:尽管初始参数量可能较大,但通过合理的patches分割和降采样设计,ViT可以在计算效率上媲美甚至超越CNN。
  • 特征多样性:多头自注意力允许模型从不同角度提取特征,增强了特征表达的丰富性。
  • 任务适应性强:ViT的架构灵活,可以轻松调整以适应图像分类、目标检测、图像分割等多种任务。

二、VisionTransformer架构设计

1. 架构总览

VisionTransformer的整体架构清晰而模块化,主要由以下几个部分组成:

  • Patch嵌入层:将输入图像分割成patches并映射到高维空间。
  • 位置编码:为每个patch的嵌入添加空间位置信息。
  • 多头自注意力层(MSA Layer):核心特征提取模块,通过多层Transformer块处理patches。
  • 分类头:将提取的特征映射到最终的分类结果。

这种设计充分利用了Transformer的强大能力,同时针对视觉任务进行了优化。

2. 核心模块

2.1 Patch嵌入层

Patch嵌入层是VisionTransformer的起点,负责将输入图像转化为适合Transformer处理的格式:

  • 分块操作:假设输入是一个形状为 [batch, channels, series, modal] 的张量(例如传感器数据或图像),模型通过卷积操作将 series 维度分割成多个patch。每个patch的大小由 patch_size 决定。
  • 嵌入映射:使用二维卷积层(nn.Conv2d)将每个patch展平并映射到指定的嵌入维度(embedding_dim),生成形状为 [batch, embedding_dim, patch_num, modal_leng] 的特征张量。

在代码中,这部分由 patch_conv 实现:

self.patch_conv = nn.Conv2d(
    in_channels=1,
    out_channels=embedding_dim,
    kernel_size=(patch_size, 1),
    stride=(patch_size, 1),
    padding=0
)

这里,卷积核的步长与patch大小一致,确保每个patch独立提取特征,输出的通道数即为嵌入维度。

2.2 位置编码

由于Transformer本身不具备空间感知能力,位置编码是必不可少的补充。它为每个patch的嵌入添加一个可学习的位置向量,帮助模型理解patches在原始图像中的相对位置。位置编码的形状为 [1, modal_leng, patch_num, embedding_dim],直接与嵌入特征相加。

在代码中,位置编码由 position_embedding 实现:

self.position_embedding = nn.Parameter(torch.zeros(1, self.modal_leng, self.patch_num, embedding_dim))

2.3 多头自注意力层(MSA Layer)

多头自注意力层是VisionTransformer的核心,由多个 VisionTransformerBlock 组成。每个块负责:

  • 多头自注意力计算:通过生成查询(Query)、键(Key)和值(Value)矩阵,计算patches之间的注意力分数,实现全局特征交互。
  • 降采样操作:通过 patch_merge 函数将相邻的patches合并,逐步减少patch数量,提升计算效率。

在代码中,这部分由 msa_layer 实现,包含三层Transformer块:

self.msa_layer = nn.Sequential(
    VisionTransformerBlock(embedding_dim, head_num, att_size), 
    VisionTransformerBlock(embedding_dim, head_num, att_size),
    VisionTransformerBlock(embedding_dim, head_num, att_size)
)

经过三层处理,patch数量从初始的 patch_num 逐步减少为原来的1/8(每次降采样减半,三次后为1/8)。

2.4 分类头

分类头将多头自注意力层的输出转化为最终的分类结果:

  • 展平操作:将特征张量展平成一维向量。
  • 全连接映射:通过两层全连接网络,先映射到1024维的中间表示,再映射到类别数。

在代码中,分类头由 dense_tower 实现:

self.dense_tower = nn.Sequential(
    nn.Linear(self.modal_leng * math.ceil(self.patch_num / 8) * embedding_dim, 1024),
    nn.LayerNorm(1024),
    nn.ReLU(),
    nn.Linear(1024, category)
)

3. 网络层级结构

以输入形状为 [batch, 1, series, modal] 的数据为例,VisionTransformer的层级结构如下:

阶段 输入形状 操作类型
输入层 [batch, 1, series, modal] Patch嵌入 + 位置编码
MSA Layer (第1层) [batch, modal_leng, patch_num, embedding_dim] 多头自注意力 + 降采样
MSA Layer (第2层) [batch, modal_leng, patch_num/2, embedding_dim] 多头自注意力 + 降采样
MSA Layer (第3层) [batch, modal_leng, patch_num/4, embedding_dim] 多头自注意力 + 降采样
输出层 [batch, modal_leng * ceil(patch_num/8) * embedding_dim] 展平 + 分类头

关键设计原则:

  • Patch嵌入:通过卷积实现高效的分块和特征提取。
  • 降采样策略:通过patch合并逐步减少计算量,保留关键信息。
  • 多头自注意力:增强特征提取的多样性和全局性。

三、代码实现深度解析

1. VisionTransformerBlock的实现

VisionTransformerBlock 是模型的核心模块,实现了多头自注意力机制和降采样功能。以下是其详细解析:

class VisionTransformerBlock(nn.Module):
    def __init__(self, input_dim=256, head_num=4, att_size=64):
        super().__init__()
        self.head_num = head_num  # 多头注意力头的数量
        self.att_size = att_size  # 每个头的维度
        self.input_dim = input_dim  # 输入嵌入维度
        self.query = nn.Linear(input_dim, head_num * att_size)  # 查询矩阵
        self.key = nn.Linear(input_dim, head_num * att_size)    # 键矩阵
        self.value = nn.Linear(input_dim, head_num * att_size)  # 值矩阵
        self.att_mlp = nn.Sequential(  # 注意力输出映射
            nn.Linear(head_num * att_size, input_dim),
            nn.LayerNorm(input_dim)
        )
        self.downsample_mlp = nn.Sequential(  # 降采样后维度恢复
            nn.Linear(input_dim * 2, input_dim),
            nn.LayerNorm(input_dim)
        )
    
    def patch_merge(self, x):
        batch, modal_leng, patch_num, input_dim = x.shape
        if patch_num % 2:  # 补齐为偶数
            x = nn.ZeroPad2d((0, 0, 0, 1))(x)
        x0 = x[:, :, 0::2, :]  # 偶数位置的patches
        x1 = x[:, :, 1::2, :]  # 奇数位置的patches
        x = torch.cat([x0, x1], dim=-1)  # 合并成双倍维度
        x = nn.ReLU()(self.downsample_mlp(x))  # 恢复原始维度
        return x

    def forward(self, x):
        batch, modal_leng, patch_num, input_dim = x.shape
        # 计算Q、K、V
        query = self.query(x).reshape(batch, modal_leng, patch_num, self.head_num, self.att_size).permute(0, 1, 3, 2, 4)
        key = self.key(x).reshape(batch, modal_leng, patch_num, self.head_num, self.att_size).permute(0, 1, 3, 4, 2)
        value = self.value(x).reshape(batch, modal_leng, patch_num, self.head_num, self.att_size).permute(0, 1, 3, 2, 4)
        # 多头自注意力
        z = torch.matmul(nn.Softmax(dim=-1)(torch.matmul(query, key) / (self.att_size ** 0.5)), value)
        z = z.permute(0, 1, 3, 2, 4).reshape(batch, modal_leng, patch_num, -1)
        z = nn.ReLU()(x + self.att_mlp(z))  # 残差连接
        out = self.patch_merge(z)  # 降采样
        return out
  • 多头自注意力:通过线性层生成Q、K、V矩阵,计算注意力分数后加权融合,恢复到原始维度并与输入残差相加。
  • Patch合并:将相邻的patches成对拼接并通过全连接层降维,实现1/2降采样。

2. VisionTransformer的实现

VisionTransformer 类整合了所有模块,形成了完整的模型:

class VisionTransformer(nn.Module):
    def __init__(self, train_shape, category, embedding_dim=256, patch_size=4, head_num=4, att_size=64):
        super().__init__()
        self.series_leng = train_shape[-2]  # 时序维度
        self.modal_leng = train_shape[-1]   # 模态维度
        self.patch_num = self.series_leng // patch_size  # patch数量
        
        self.patch_conv = nn.Conv2d(  # Patch嵌入
            in_channels=1,
            out_channels=embedding_dim,
            kernel_size=(patch_size, 1),
            stride=(patch_size, 1),
            padding=0
        )
        self.position_embedding = nn.Parameter(torch.zeros(1, self.modal_leng, self.patch_num, embedding_dim))  # 位置编码
        self.msa_layer = nn.Sequential(  # 多头自注意力层
            VisionTransformerBlock(embedding_dim, head_num, att_size), 
            VisionTransformerBlock(embedding_dim, head_num, att_size),
            VisionTransformerBlock(embedding_dim, head_num, att_size)
        )
        self.dense_tower = nn.Sequential(  # 分类头
            nn.Linear(self.modal_leng * math.ceil(self.patch_num / 8) * embedding_dim, 1024),
            nn.LayerNorm(1024),
            nn.ReLU(),
            nn.Linear(1024, category)
        )

    def forward(self, x):
        x = self.patch_conv(x)  # Patch嵌入
        x = self.position_embedding + x.permute(0, 3, 2, 1)  # 添加位置编码
        x = self.msa_layer(x)  # 多头自注意力处理
        x = nn.Flatten()(x)  # 展平
        x = self.dense_tower(x)  # 分类
        return x
  • 前向传播:从Patch嵌入到位置编码,再经过多层自注意力处理,最后通过分类头输出结果。
  • 灵活性:通过调整 patch_size 和 embedding_dim,模型可以适配不同规模的输入数据。

3.VisionTransformer与传统方法的对比

指标 VisionTransformer 传统CNN
特征提取方式 多头自注意力 局部卷积
感知范围 全局 局部
参数量 依赖patch数和层数,可控 随通道数增加
计算复杂度 与patch数平方相关 与卷积核相关
任务适应性
典型应用 图像分类、时间序列分析 图像分类、分割

VisionTransformer通过全局自注意力机制突破了CNN的局部限制,尤其在需要捕捉长距离依赖的任务中表现出色。

四、WISDM数据集实战结果

VisionTransformer(ViT)是一种基于Transformer架构的创新模型,通过多头自注意力机制(Multi-Head Self-Attention)在计算机视觉和时间序列分析领域展现出卓越的性能。与传统的卷积神经网络(CNN)不同,ViT从全局视角处理数据,擅长捕捉长距离依赖关系,这在行为识别任务中尤为关键。本节以WISDM数据集为例,展示ViT的实际应用及其实验结果。

WISDM(Wireless Sensor Data Mining)数据集是行为识别领域的经典基准数据集,数据来源于智能手机内置的加速度计和陀螺仪传感器,采样频率为20Hz。数据集记录了受试者执行六种日常活动:Walking(步行)、Jogging(慢跑)、Walking_upstairs(上楼)、Walking_downstairs(下楼)、Sitting(坐着)和Standing(站立)。本研究采用滑动窗口技术对原始数据进行预处理,设置窗口长度为128个采样点,滑动步长为64个采样点(即50%的窗口重叠率),生成大量样本单元用于模型训练和评估。

1.训练结果

基于空洞卷积的模型在PAMAP2数据集上的性能如下表所示:
| Metric | Value |
| Parameters | 4,367,366 |
| FLOPs | 58.56 M |
| Inference Time | 2.90 ms |
| Val Accuracy | 0.9840 |
| Test Accuracy | 0.9781 |
| Accuracy | 0.9781 |
| Precision | 0.9781 |
| Recall | 0.9781 |
| F1-score | 0.9780 |

2.每个类别的准确率

Walking: 0.9863
Jogging: 0.9962
Walking_upstairs: 0.9945
Walking_downstairs: 1.0000
Sitting: 0.9118
Standing: 0.9408

模型在简单动作(如 Walking、Downstairs)上表现优异,准确率接近 1;对静态或相似动作(如 Sitting、Standing)的区分准确率超过 0.98,体现了分组卷积对结构化特征的高效提取能力。对于空间动作幅度较大的 Upstairs,准确率稍低,可能与时间序列维度的特征对齐精度有关。

3.混淆矩阵图及准确率和损失曲线图

ResNext 在 UCI数据集上的分类性能通过标准化混淆矩阵可视化,矩阵行代表真实标签,列代表预测标签:
image.png

深蓝色块表示高准确率,例如Walking_downstairs(1.0000)和Jogging(0.9962),显示出模型的优异性能。动态活动(如Walking、Jogging、Walking_upstairs和Walking_downstairs)之间几乎无混淆,反映了模型对运动模式的精准识别能力。

训练过程中,ResNext 的训练集与验证集指标表现如下:
image.png

训练损失在 50 个 epoch 内降至 0.05 以下,验证损失同步下降,最终稳定在 0.06 左右,训练和验证指标的接近表明ViT模型具有良好的泛化能力,训练过程收敛充分。

总结

VisionTransformer(ViT)通过其多头自注意力机制,在WISDM数据集的行为识别任务中展现了卓越的性能。相比传统卷积架构,ViT在全局特征提取和长距离依赖建模方面具有显著优势,尤其在处理动态活动的时间序列数据时表现出色。
未来可通过优化注意力机制、增加数据增强或调整模型结构,进一步提升对静态活动的区分能力,推动其在更广泛场景中的应用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。