You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派部署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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 03:06:05