VisionTransformer(ViT) 是一种基于Transformer架构的创新模型,近年来在计算机视觉领域掀起了不小的波澜。它通过引入多头自注意力机制(Multi Self-Attention),抛弃了传统卷积神经网络(CNN)的局部特征提取方式,转而以全局视角处理图像数据。
传统卷积神经网络(CNN)在图像处理中长期占据主导地位,但随着任务复杂度和数据规模的增加,它的局限性逐渐显现:
这些问题促使研究者寻找新的解决方案,而VisionTransformer正是这一背景下诞生的产物。
VisionTransformer的核心在于将Transformer架构从自然语言处理领域迁移到计算机视觉。它通过多头自注意力机制(Multi Self-Attention)处理图像数据,具体流程可以概括为以下几个步骤:
这种机制完全跳过了传统卷积的局部操作,直接从全局角度理解图像内容,为视觉任务提供了一种全新的思路。
VisionTransformer相较于传统CNN展现出了显著的优势:
VisionTransformer的整体架构清晰而模块化,主要由以下几个部分组成:
这种设计充分利用了Transformer的强大能力,同时针对视觉任务进行了优化。
Patch嵌入层是VisionTransformer的起点,负责将输入图像转化为适合Transformer处理的格式:
在代码中,这部分由 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独立提取特征,输出的通道数即为嵌入维度。
由于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))
多头自注意力层是VisionTransformer的核心,由多个 VisionTransformerBlock 组成。每个块负责:
在代码中,这部分由 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)。
分类头将多头自注意力层的输出转化为最终的分类结果:
在代码中,分类头由 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)
)
以输入形状为 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 | 展平 + 分类头 |
关键设计原则:
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
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
指标 | VisionTransformer | 传统CNN |
---|---|---|
特征提取方式 | 多头自注意力 | 局部卷积 |
感知范围 | 全局 | 局部 |
参数量 | 依赖patch数和层数,可控 | 随通道数增加 |
计算复杂度 | 与patch数平方相关 | 与卷积核相关 |
任务适应性 | 高 | 中 |
典型应用 | 图像分类、时间序列分析 | 图像分类、分割 |
VisionTransformer通过全局自注意力机制突破了CNN的局部限制,尤其在需要捕捉长距离依赖的任务中表现出色。
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%的窗口重叠率),生成大量样本单元用于模型训练和评估。
基于空洞卷积的模型在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 |
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,准确率稍低,可能与时间序列维度的特征对齐精度有关。
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在全局特征提取和长距离依赖建模方面具有显著优势,尤其在处理动态活动的时间序列数据时表现出色。
未来可通过优化注意力机制、增加数据增强或调整模型结构,进一步提升对静态活动的区分能力,推动其在更广泛场景中的应用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。