结合CNN和gMLP的时间序列分类模型
结合CNN和gMLP的时间序列分类模型
这篇博客文章介绍了一个用于时间序列分类的深度学习模型。该模型结合了卷积神经网络 (CNN) 和门控 MLP (gMLP),旨在有效地捕捉时间序列数据中的空间和时间依赖性。
模型架构
该模型可以分解为以下步骤:
-
卷积层 (CNN): 模型的第一层是一个二维卷积层 (
self.conv1)。它接受一个形状为 (1, 10000, 12) 的张量作为输入,其中: - 1 代表批大小 - 10000 代表时间序列的长度 - 12 代表每个时间步长的特征维度该卷积层有 600 个输出通道,卷积核大小为 (200, 3),步长为 (200, 3)。它旨在从输入时间序列中提取局部特征。
-
gMLP 模块: 卷积层的输出被送入一个 gMLP 模块 (
self.gmlp)。gMLP 模块是一个由 6 个gMLPBlock模块组成的堆栈。每个gMLPBlock包含两个子模块:- 空间门控单元 (SGU): SGU 允许跨通道的特征交互和选择性特征过滤。 - MLP 层: MLP 层对特征表示执行非线性变换。
gMLP 模块的设计使其能够有效地捕捉时间序列数据中的长期依赖关系。
-
平均池化: 在经过 gMLP 模块后,对特征图执行平均池化操作,以减少其维度并保留最重要的信息。
-
全连接层: 最后,使用一个全连接层 (
self.out) 将学习到的特征映射到 6 个类别。该层产生一个形状为 (1, 6) 的输出张量,表示每个类别的预测概率。
代码解析
让我们逐步浏览代码:pythonimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom gmlp import SpatialGatingUnit, gMLPBlock, gMLP
class CNN(nn.Module): def init(self): # 初始化方法 super(CNN, self).init() # 初始化父类方法 # 第一层卷积层,输入为 (1,10000,12) self.conv1 = nn.Conv2d( # 二维卷积层 in_channels=1, # 输入通道数 out_channels=600, # 输出通道数(卷积核数量) kernel_size=(200, 3), # 卷积核大小 stride=(200, 3), # 卷积核移动步长 )
self.gmlp = gMLP(d_model=600, d_ffn=1200, seq_len=200, num_layers=6) self.out = nn.Linear(600, 6) # 全连接层,输出6个类别
# 定义一个名为CNN的类,继承自PyTorch的nn.Module
def forward(self, x): # 前向传播方法 x = self.conv1(x) # 通过第一个卷积层序列 # 四维转三维 N, C, H, W = x.shape x = x.view(N, C, H * W).permute(0, 2, 1)
x = self.gmlp(x) x = x.mean(dim=1) feature = x output = self.out(x) # 通过全连接层得到输出 return feature, output # 返回特征和输出
这段代码定义了一个名为 CNN 的类,该类继承自 PyTorch 的 nn.Module。__init__ 方法初始化模型的各个层,包括卷积层 (self.conv1)、gMLP 模块 (self.gmlp) 和全连接层 (self.out)。
forward 方法定义了数据在模型中的前向传递。它依次执行以下步骤:
- 卷积: 输入张量
x首先经过卷积层 (self.conv1)。2. 形状重排: 卷积层的输出被重塑并转置,为 gMLP 模块做好准备。3. gMLP 处理: 然后,重塑后的张量被送入 gMLP 模块 (self.gmlp)。4. 平均池化: 对 gMLP 模块的输出执行平均池化。5. 全连接层: 平均池化后的特征向量被送入全连接层 (self.out),以产生最终的预测。
该模型返回最终的预测 (output) 以及 gMLP 模块 (feature) 的输出。
结论
这个 CNN 和 gMLP 相结合的模型为时间序列分类提供了一种强大的方法。通过结合 CNN 的局部特征提取能力和 gMLP 捕捉长期依赖关系的能力,该模型可以有效地学习时间序列数据中的复杂模式。该模型的模块化设计也允许根据特定任务需求轻松地进行调整和扩
原文地址: http://www.cveoy.top/t/topic/2su 著作权归作者所有。请勿转载和采集!