论文名称:AI-Assisted Fatigue and Stamina Control for Performance Sports on IMU-Generated Multivariate Times Series Datasets
期刊:Sensors
时间:2024
提出了一种基于IMU(惯性测量单元)多变量时间序列数据的LSTM模型,用于实时预测运动员的疲劳(fatigue)和耐力(stamina)状态,从而实现个性化训练调控,避免过度训练和运动损伤
数据集
Multivariate Time Series data of Fatigued and Non-Fatigued Running from Inertial Measurement Units (0.0)
开源数据集,非作者团队采集,由Kathirgamanathan等人发布于Zenodo平台
数据内容
- 来自19名健康跑者的IMU数据(3轴加速度、角速度、磁场方向)
- 采样频率:256Hz
- 实验流程:400米匀速跑 → 疲劳诱导(beep test) → 疲劳状态下400米跑
- 标签:每段数据标注为"疲劳(F)"或"非疲劳(NF)"
仅使用IMU数据,无GNSS或其他传感器融合
主要工作
分类任务(短期状态识别),非路径预测或趋势预测
目标是对每一时刻的IMU数据判断运动员当前是否处于疲劳状态
深度学习模型
使用LSTM(Long Short-Term Memory)网络,用于捕获时间序列中的疲劳/耐力动态变化
输入为IMU多变量时间序列(3轴加速度、角速度、磁场),经过预处理(滤波、归一化、滑动窗口分段)
LSTM层用于捕捉时间依赖关系,输出层为Dense(2) + Softmax,进行二分类(疲劳/非疲劳)
原始数据采集模块
输入为Shimmer 3 IMU(佩戴再腰骶部)实时采集,维度 (T_{raw}, 9)
- 包含3轴加速度 ax, ay, az、3轴角速度 ωx, ωy, ωz、三轴磁场 mx, my, mz
- T_{raw} ≈ 25 600 点(100 s × 256 Hz),这里的25600是时间维长度
把9维原始IMU通道堆成一个张量,为后续同步处理做准备
预处理 & 滑动窗口切片
输入为 (T_{raw}, 9) 原始张量
通过 Butterworth
低通滤波 → 去重力 → z-score
归一化
输出 (N_{window}, W, 9)
-
窗口长度 W = 128 点(0.5s窗口,与步频对齐)
-
步长 Stride = 10 点
-
窗口个数 N_{window} 计算,N_{window}
= floor((T_{raw}-W)/stride)+1
= floor((25600-128)/10)+1
= 2547+1=2548
切分完后的张量形状:(2548, 128, 9)
滤掉高频噪声、统一量纲 ,并把长序列切成可批量送入 LSTM
的小段
特征工程(可选通道融合)
输入 (N_{window}, W, 9)
- 计算合加速度 a_{mag} = √(ax²+ay²+az²)
- 计算合角速度 ω_{mag} = √(ωx²+ωy²+ωz²)
可以选择将上述2个通道的数据也加入,将9维拓展到11维
输出 (N_{window}, W, F) ,其中 F=9;默认实验没有加上上述2个通道,如果做消融/增广实验可采用
给网络提供更高阶的运动强度描述,提高信噪比
LSTM时序编码器
把上述 (N_{window}, W, F) 再按batch_{size}=32切成小批,tf.data.Dataset.batch(32)
输入LSTM
(batch, W, F) ,维度 (32, 128, 9)
LSTM 参数
- hidden_{size} = 64
- num_{layers} =2 (双向)
- dropout = 0.2
LSTM层在 PyTorch/TF 里的 return_sequences 开关决定形状:
- False(默认) :只返回 最后一个时间步 的 hidden state shape =
(batch, hidden_size)
- True :返回 所有时间步 的 hidden sequence shape =
(batch, W, hidden_size)
论文中取最后一时间步的隐藏状态,输出 (batch, 64)
捕获 0.5 s 窗口内的步态动力学模式,映射成定长向量 h_t
全连接分类头
输入64维步态特征向量 (batch, 64)
-
Dense(32, relu)
- 计算矩阵W1形状(64, 32),偏置b1形状(32,)
- 计算h1=relu(x @ W1 + b1)
- 输出(batch, 32)
-
Dropout(0.3)
- 训练阶段按概率 0.3 随机把 32 个神经元置 0,并缩放剩余值
×1/(1-0.3)
- 推理阶段不做任何操作,直接透传
- 输出形状不变 (batch, 32)
- 训练阶段按概率 0.3 随机把 32 个神经元置 0,并缩放剩余值
-
Dense(2, softmax)
- 权重矩阵W2形状(32,2),偏置b2形状(2,)
- 计算logits = h1 @ W2 + b2
- softmax: p=softmax(logits)
- 输出(batch, 2) 每行[P(NF), P(F)],概率和为 1
把LSTM的64维表征映射到二分类空间,输出"非疲劳 vs 疲劳"置信度
损失计算与反馈
标签 (batch, ) 0=NF, 1=F
损失Categorical Cross-Entropy:−∑ y_{i} log(p_{i})
交叉熵损失衡量"预测概率离真实标签多远";
优化器:Adam(lr=1e-3, deacy=1e-5)
- Adam(Adaptive Moment Estimation)是一种自适应学习率的梯度下降算法,利用梯度的一阶、二阶动量自动给每个参数调步长
- lr是初始学习率(learning rate),控制每一步沿梯度方向走多远
- decay是学习率衰减系数(weight decay/lr decay),每轮 epoch 后把 lr 乘一个略小于 1 的因子,防止震荡、帮助收敛
输出:标量loss
驱动网络更新,使预测概率逼近真实疲劳标签
补充:Dense
Dense层 (全连接层,Fully Connected Layer):每个神经元与前一层的所有神经元相连接,因此称为"全连接"。
功能:对输入数据进行加权组合 (线性变换)和非线性激活,用于提取高阶特征或进行分类。
输入:任意维度的数据(通常会被展平为一维向量)。
输出:固定维度的向量(由神经元数量决定)。
计算过程:
- 线性变换 :
输出 = 权重矩阵 × 输入向量 + 偏置向量
- 非线性激活:通过激活函数(如ReLU、Sigmoid)增加非线性表达能力。
参数数量公式:参数数量 = 输入维度 × 输出维度 + 输出维度
示例:输入维度为 256,输出维度为 128 → 参数数量 = 256×128 + 128 = 33,024
参数量大,容易导致过拟合或计算成本高(尤其在输入维度高时)。
主要作用:
- 特征组合:整合前一层的局部特征,生成全局特征。
- 分类/回归:常用于神经网络的最后几层,输出预测结果(如分类概率)。
- 非线性建模:通过激活函数拟合复杂的数据分布。
优点:
- 强大的表达能力,适合复杂模式学习。
- 实现简单,通用性强。
缺点:
- 参数量大,易过拟合。
- 丢失空间信息(如处理图像时需先展平输入)。
补充:优化器
优化器是自动找使损失函数最小的参数
给定损失 L(θ) 和当前梯度 ∇L,优化器决定
θ ← θ − η · update(∇L)
它就是"封装好的梯度下降改进版",免去了手写学习率、动量、二阶矩等细节
常见替代优化器
名称 | 特点 | 适用场景 |
---|---|---|
SGD | 最朴素,可加动量 | 大 batch、简单任务 |
SGD+Momentum | 加速收敛、抑制震荡 | CNN 经典搭配 |
AdaGrad | 自适应但累计平方梯度会单调降 | 稀疏梯度(NLP) |
RMSprop | AdaGrad 改进,梯度平方滑动平均 | RNN、LSTM 常用 |
Adam | 综合 Momentum + RMSprop | 默认首选 |
AdamW | 把 weight decay 从梯度里解耦 | Transformer、大模型 |
Nadam | Adam + Nesterov 动量 | 对凸问题更快 |
模型性能对比
模型类别 | 模型名称 | Accuracy | Precision | Recall | F1 Score |
---|---|---|---|---|---|
传统ML | Random Forest | 50.51% | 52.33% | 47.67% | 49.57% |
传统ML | Decision Tree | 50.66% | 52.11% | 50.50% | 51.15% |
传统ML | SVM (Linear) | 49.12% | 47.02% | 77.91% | 54.39% |
深度学习 | LSTM | 59.00% | 61.00% | 60.00% | 60.00% |