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

06-02 1419阅读

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最新最全教程!

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

本文目录:

  • 一、VisionTransformer的基础原理
    • 1. 传统卷积的瓶颈与挑战
    • 2. VisionTransformer的核心机制
    • 3. VisionTransformer的技术优势
    • 二、VisionTransformer架构设计
      • 1. 架构总览
      • 2. 核心模块
        • 2.1 Patch嵌入层
        • 2.2 位置编码
        • 2.3 多头自注意力层(MSA Layer)
        • 2.4 分类头
        • 3. 网络层级结构
        • 三、代码实现深度解析
          • 1. VisionTransformerBlock的实现
          • 2. VisionTransformer的实现
          • 3.VisionTransformer与传统方法的对比
          • 四、WISDM数据集实战结果
            • 1.训练结果
            • 2.每个类别的准确率
            • 3.混淆矩阵图及准确率和损失曲线图
            • 总结
              • 文末送书
                • 参与方式
                • `本期推荐1:`《巧用DeepSeek快速搞定数据分析》
                • `本期推荐2:`《DeepSeek实战技巧精粹》

                  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数据集上的分类性能通过标准化混淆矩阵可视化,矩阵行代表真实标签,列代表预测标签:

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

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

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

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

                                      训练损失在 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驱动的数据科学中攀登巅峰。Python从0到100(九十七):VisionTransformer(ViT)在时间序列行为识别中的应用

                                      京东: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例)

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

                                      京东: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技术人员阅读。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码