树莓派部署TensorFlow Lite版LSTM做加速度实时识别报错求助
问题排查与修复方案
1. 窗口采集思路验证
你的思路是正确的,模型要求输入维度(200,3)对应200个时间步、每个时间步3轴加速度特征,确实需要采集长度为200的样本窗口。但现有代码存在采样逻辑、数据形状两个核心问题。
2. 采样代码问题修复
现有采样代码存在三个明显错误:
- 累计计算三轴数值:如果训练时使用的是瞬时加速度值,累加操作会导致输入数据分布和训练集完全不符,推理准确率会严重下降
- 数据存储结构错误:每次采样的三轴值被展开成一维追加,最终得到的是长度200的一维数组,而非要求的(200,3)二维结构
- 重复实例化传感器:每次采样都新建ADXL345对象,会增加不必要的IO开销,甚至导致读取延迟
修正后的采样代码参考:
def get_sample(): sample_list = [] sample_count = 0 adxl345 = ADXL345() # 传感器实例化移到循环外 last_time = time.time_ns() / 1000000000 while sample_count < 200: # 直接采200个时间步 if time.time() - last_time >= 0.01: axes = adxl345.getAxes(True) # 直接存储当前瞬时值,做归一化 norm_x = (axes['x'] + 9.80665) / (9.80665 * 2) norm_y = (axes['y'] + 9.80665) / (9.80665 * 2) norm_z = (axes['z'] + 9.80665) / (9.80665 * 2) sample_list.append([norm_x, norm_y, norm_z]) last_time = time.time_ns() / 1000000000 sample_count += 1 time.sleep(0.001) return sample_list
3. 推理代码问题修复
报错核心原因是输入维度不匹配:你当前构造的输入形状是(1, 200),但模型要求的输入形状是(batch_size, 200, 3)。
修正后的推理代码参考:
interpreter = tflite.Interpreter(model_path=model_file) interpreter.allocate_tensors() # 获取输入输出张量信息 input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 转换数据格式,添加batch维度 sample_arr = np.array(get_sample(), dtype=np.float32) # 此时sample_arr形状是(200,3),扩展为(1,200,3)匹配输入要求 input_data = np.expand_dims(sample_arr, axis=0) interpreter.set_tensor(input_details[0]['index'], input_data) interpreter.invoke() # 获取输出 output_data = interpreter.get_tensor(output_details[0]['index'])
补充说明
如果你的训练集确实使用了累加后的加速度特征,可保留累加逻辑,但仍然需要调整数据存储结构为(200,3)的二维数组。
内容的提问来源于stack exchange,提问作者saifaljanahi
相关产品推荐
相关产品推荐

