无人船姿态数据包括:
数据格式:时间序列,每个时间步记录上述所有状态值。
时间步是时序数据中的一个采样点,代表某个时刻的状态
假设每0.1秒采集一次无人船的姿态数据:
展开代码时间步0:t=0.0秒,记录 [Roll=5°, Pitch=3°, Yaw=45°] 时间步1:t=0.1秒,记录 [Roll=5.2°, Pitch=3.1°, Yaw=45.5°] 时间步2:t=0.2秒,记录 [Roll=5.5°, Pitch=3.3°, Yaw=46°] 时间步3:t=0.3秒,记录 [Roll=5.8°, Pitch=3.6°, Yaw=46.5°] 时间步4:t=0.4秒,记录 [Roll=6.0°, Pitch=3.8°, Yaw=47°] ...
这里:
核心思想:用历史姿态预测未来姿态
seq_length = 10 表示: 用过去10个时间步的数据作为输入,如果采样间隔是0.1秒,那么10个时间步 = 1.0秒的历史数据
样本的定义:
假设采集了1000个时间步的无人船姿态数据:
展开代码时间步0: [Roll₀, Pitch₀, Yaw₀] 时间步1: [Roll₁, Pitch₁, Yaw₁] 时间步2: [Roll₂, Pitch₂, Yaw₂] ... 时间步999: [Roll₉₉₉, Pitch₉₉₉, Yaw₉₉₉]
创建样本(假设seq_length=10,pred_length=1):10个时间步的输入 + 1个时间步的目标
单个样本预测过程(假定网络是训练好的):
样本1:
展开代码x₀ → h₀, c₀ ↓ x₁ + h₀, c₀ → h₁, c₁ ↓ x₂ + h₁, c₁ → h₂, c₂ ↓ ... ↓ x₉ + h₈, c₈ → h₉, c₉ 最终输出: 使用最后一个时间步的隐藏状态 h₉ h₉包含了整个序列(x₀到x₉)的信息
样本2:
样本3:
...
样本990:
结果:从1000个时间步的数据中,可以创建990个样本
批次大小=32(一次处理多个样本,利用并行计算):
从990个样本中随机选择32个,这32个样本组成一个批次,用这个批次进行一次参数更新
展开代码样本1, 样本5, 样本10, ..., 样本100(随机选择32个)
下一个批次: 再选择32个样本(可能与之前有重叠), 进行下一次参数更新
展开代码样本3, 样本7, 样本15, ..., 样本200(再随机选择32个)
知道了一个样本是如何得到最后一个隐藏状态的,32个样本共享权值,并行工作时,批次处理的完整过程:
输入:[32, 10, 3]
展开代码样本1:x₀¹ → LSTM → h₀¹, c₀¹ 样本2:x₀² → LSTM → h₀², c₀² ... 样本32:x₀³² → LSTM → h₀³², c₀³² 输出:h₀ = [32, 64], c₀ = [32, 64]
展开代码样本1:x₁¹ + h₀¹, c₀¹ → LSTM → h₁¹, c₁¹ 样本2:x₁² + h₀², c₀² → LSTM → h₁², c₁² ... 样本32:x₁³² + h₀³², c₀³² → LSTM → h₁³², c₁³² 输出:h₁ = [32, 64], c₁ = [32, 64]
最终输出: 使用h₉ = [32, 64](32个样本,每个样本最后一个时间步的隐藏状态)
详细维度说明:
例子:只预测3个姿态角
输入形状:[32, 10, 3]
输入形状:[32, 10, 3]
输入到LSTM单元:
LSTM内部计算:
展开代码concat_input = [ht-1, xt] = [64维隐藏状态, 3维输入] = 67维向量
时间步0的输出:
输入到LSTM单元:
LSTM内部计算:
展开代码concat_input = [ht-1, xt] = [64维隐藏状态, 3维输入] = 67维向量
时间步0的输出:
若只输出最后一个时间步(每个样本只取最后一个时间步(时间步9)的隐藏状态): 输出形状:[32, 64]
展开代码样本1:时间步0-9 → h₉ → [64维向量] 样本2:时间步0-9 → h₉ → [64维向量] ... 样本32:时间步0-9 → h₉ → [64维向量] 最终:32个样本,每个样本一个64维向量 形状:[32, 64]
全连接层目的:将抽象的隐藏状态映射到具体的姿态角预测值
输入:LSTM的隐藏状态
过程:
输出:
输出形状取决于预测任务,例:预测未来1个时间步的姿态
例子:
展开代码样本1的预测: 未来时间步10: [Roll₁₀, Pitch₁₀, Yaw₁₀] 样本2的预测: 未来时间步11: [Roll₁₁, Pitch₁₁, Yaw₁₁]
数据准备:假设采集了1000个时间步的无人船姿态数据
1、创建训练样本
样本1:
展开代码y = [6.2, 4.0, 47.5] ← 真实采集的数据
样本2:
...
2、前向传播
展开代码输入:样本1的时间步0-9数据 ↓ LSTM处理 ↓ 全连接层 ↓ 模型预测:y_pred = [6.1, 3.9, 47.3] ← 这是模型预测的值
展开代码真实标签:y_true = [6.2, 4.0, 47.5] ← 这是采集到的真实数据 模型预测:y_pred = [6.1, 3.9, 47.3] ← 这是模型预测的值 损失 = MSE(y_pred, y_true) = (6.1-6.2)² + (3.9-4.0)² + (47.3-47.5)² = 0.01 + 0.01 + 0.04 = 0.06
本文作者:cc
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!