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

如何在C++中为TensorFlow Lite(TFLite)的LSTM模型输入(10,1)形状的变量

解决TFLite LSTM模型(10,1)输入的C++数据填充问题

我来帮你搞定这个输入配置的问题——你在Python中定义的LSTM输入形状是(10,1),导出为TFLite模型后,对应的输入张量实际上是三维形状[1, 10, 1](分别对应batch_size=1、时间步长=10、特征数=1),这和你代码中打印出的1, 10, 1完全匹配。

问题核心

你之前只给输入张量的第一个元素赋值:

interpreter->typed_input_tensor<float>(0)[0] = 0.503892;

这只填充了序列的第一个时间步,但LSTM需要完整的10个时间步数据才能正确执行推理,这就是你遇到问题的关键。

正确的输入填充方式

你已经准备好10个输入值的inputs向量,只需要把这些值按顺序填充到输入张量的连续内存中即可。TFLite张量采用行优先内存布局,三维张量[1,10,1]在内存中就是一段连续的10个float值,对应每个时间步的特征数据。

修改你的输入填充代码如下:

// 你的10个时间步输入数据
vector<float> inputs = {
  0.503892, 0.50349951,
  0.50574788, 0.50799569,
  0.49414472, 0.49407101,
  0.50661932, 0.49726027,
  0.50289517, 0.48882814
};

// 获取输入张量的float指针
float* input_tensor = interpreter->typed_input_tensor<float>(0);

// 循环填充所有10个时间步的数据
for (size_t i = 0; i < inputs.size(); ++i) {
  input_tensor[i] = inputs[i];
}

验证输入形状(可选)

你已经通过打印代码确认了输入张量的维度:

fprintf(stderr, "%d, %d, %d, %d, %d\n", input_size, batch_size, h, w, channels);
// 输出:3, 1, 10, 1, 0

这里的input_size=3表示张量是3维,batch_size=1是批量大小,h=10是时间步长,w=1是每个时间步的特征数,完全符合你Python模型的输入定义。

完整修改后的C++代码片段

替换你原代码中Fill input buffers部分的内容后,完整的推理流程代码如下:

// Allocate tensor buffers.
TFLITE_MINIMAL_CHECK(interpreter->AllocateTensors() == kTfLiteOk);

// Fill input buffers
vector<float> inputs = {
  0.503892, 0.50349951,
  0.50574788, 0.50799569,
  0.49414472, 0.49407101,
  0.50661932, 0.49726027,
  0.50289517, 0.48882814
};
float* input_tensor = interpreter->typed_input_tensor<float>(0);
for (size_t i = 0; i < inputs.size(); ++i) {
  input_tensor[i] = inputs[i];
}

// 打印输入张量维度(可选)
const vector<int>& t_inputs = interpreter->inputs();
TfLiteTensor* tensor = interpreter->tensor(t_inputs[0]);
int input_size = tensor->dims->size;
int batch_size = tensor->dims->data[0];
int time_steps = tensor->dims->data[1];
int features = tensor->dims->data[2];
fprintf(stderr, "Input tensor shape: %dD [batch: %d, time_steps: %d, features: %d]\n", 
        input_size, batch_size, time_steps, features);

// Run inference
TFLITE_MINIMAL_CHECK(interpreter->Invoke() == kTfLiteOk);

// Read output buffers
float* result = interpreter->typed_output_tensor<float>(0);
fprintf(stderr, "predict : %f\n", *result);

这样修改后,你的TFLite模型就能接收到完整的10步序列输入,LSTM层可以正常工作并输出正确的推理结果。

内容的提问来源于stack exchange,提问作者mateoricfarm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:22:31