如何在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
相关产品推荐
相关产品推荐

