Python从0到100(九十七):VisionTransformer(ViT)在时间序列行为识别中的应用

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者!
【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受:
- 所有问题解答
-专属福利领取

欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!
在这里插入图片描述


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数据集上的分类性能通过标准化混淆矩阵可视化,矩阵行代表真实标签,列代表预测标签:
在这里插入图片描述
深蓝色块表示高准确率,例如Walking_downstairs(1.0000)和Jogging(0.9962),显示出模型的优异性能。动态活动(如Walking、Jogging、Walking_upstairs和Walking_downstairs)之间几乎无混淆,反映了模型对运动模式的精准识别能力。

训练过程中,ResNext 的训练集与验证集指标表现如下:
在这里插入图片描述

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

总结

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

文末送书

参与方式

免费包邮送三本! Dream送书活动——第六十二期:《DeepSeek实战技巧精粹》、《巧用DeepSeek快速搞定数据分析》
参与方式:

1.点赞收藏文章
2.在评论区留言:人生苦短,我用Python!(多可评论三条)
3.随机抽取3位免费送出!
4.截止时间: 2025-05-14
上期中奖名单:珊瑚海儿、m0_weixin0982、有一只柴犬

本期推荐1:《巧用DeepSeek快速搞定数据分析》

《巧用DeepSeek快速搞定数据分析》
数据分析重构指南:覆盖数据采集→清洗→建模→可视化等8大核心环节全流程解析,50多种高效方法+200多行业级代码片段即改即用+15种数据难题秒级解决方案,助你在AI驱动的数据科学中攀登巅峰。在这里插入图片描述

京东:https://item.jd.com/14995198.html

1.全栈:覆盖数据采集→清洗→建模→可视化8大核心环节全流程解析。
2.极速:解锁15种数据难题秒级解决方案,效率提升300%。
3.智能:深度集成20+前沿AI算法,实现数据分析自动化跃迁。
4.实战:200+行业级代码片段即改即用,涵盖金融、电商、社交等6大领域。
5.突破:首度公开DeepSeek在时序预测、图像分析、文本挖掘等5大创新应用。
内容简介
本书是一本关于数据分析与DeepSeek应用的实用指南,旨在帮助读者了解数据分析的基础知识及如何利用DeepSeek进行高效的数据处理和分析。随着大数据时代的到来,数据分析已经成为现代企业和行业发展的关键驱动力,本书正是为了满足这一市场需求而诞生。
本书共分为8章,涵盖了从数据分析基础知识、常见的统计学方法,到使用DeepSeek进行数据准备、数据清洗、特征提取、数据可视化、回归分析与预测建模、分类与聚类分析及深度学习和大数据分析等全面的内容。各章节详细介绍了如何运用DeepSeek在数据分析过程中解决实际问题,并提供了丰富的实例以帮助读者快速掌握相关技能。
本书适合数据分析师、数据科学家、研究人员、企业管理者、学生及对数据分析和人工智能技术感兴趣的广大读者阅读。通过阅读本书,读者将掌握数据分析的核心概念和方法,并学会如何运用DeepSeek为数据分析工作带来更高的效率和价值。

本期推荐2:《DeepSeek实战技巧精粹》

《DeepSeek实战技巧精粹》
中国人工智能学会副理事长、Datawhale主编力荐的AI通识课(含视频教程+AI有效提问500例)
在这里插入图片描述

京东:https://item.jd.com/14427039.html

【多场景AI实战指南】深度解析DeepSeek,100+智能解决方案覆盖办公制表、合同风控、短视频创作、家庭教育、健康管理等应用场景,职场效率100倍提升。
【智能生产力革命手册】AI与办公软件深度联动,Excel数据自动分析技巧、WPS灵犀一键生成PPT、通义万相迅速生成视频,更附赠提示词模板让,精准理解用户需求。
【三维能力进阶宝典】从注册到API调用,从思维导图构建到各行业应用解读,100+真实案例手把手教学,助力工作生活效率双提升。
【未来竞争力构建指南】聚焦“提示词工程+多模态创作”双核能力,涵盖多领域创新应用,一书赋能,全面提升竞争力。
内容简介
中国的 AI 技术逆势崛起,催生了 DeepSeek 这样革命性的大模型。本书通过 100 多个实例,详细介绍了 DeepSeek 的最新功能及在职场办公方方面面的应用。全书以“技术赋能”为主线,围绕6大核心领域展开:DeepSeek基础知识、DeepSeek赋能智能办公、使用 DeepSeek 进行短视频与营销内容创作、DeepSeek 辅助家庭教育与学习力提升、使用 DeepSeek进行健康管理与出行规划、国产 AI 大模型应用介绍。本书适合职场人士、内容创作者、教育工作者及IT技术人员阅读。

评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Dream呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值