https://github.com/DocDriven/tflite-cpp-api-tests
).
但是,如果用C++ API加载和检查模型,我会得到令人惊讶的结果。下面的片段试图说服我,我的模型有大量的输入、输出和节点。
const std::string model_path = "model.tflite";
// Load the model.
std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile(model_path.c_str());
if (model == nullptr) {
std::cerr << "Failed to build FlatBufferModel from file: " << model_path << std::endl;
std::abort();
}
tflite::ops::builtin::BuiltinOpResolver resolver;
std::unique_ptr<tflite::Interpreter> interpreter;
if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != kTfLiteOk)
{
std::cerr << "Failed to build interpreter." << std::endl;
}
if (interpreter->AllocateTensors() != kTfLiteOk) {
std::cerr << "Failed to allocate tensors." << std::endl;
}
interpreter->ResetVariableTensors();
LOG(INFO) << "tensors size: " << interpreter->tensors_size() << std::endl;
LOG(INFO) << "nodes size: " << interpreter->nodes_size() << std::endl;
LOG(INFO) << "inputs: " << interpreter->inputs().size() << std::endl;
LOG(INFO) << "input(0) name: " << interpreter->GetInputName(0) << std::endl;
LOG(INFO) << "outputs: " << interpreter->outputs().size() << std::endl;
LOG(INFO) << "output(0) name: " << interpreter->GetOutputName(0) << std::endl;
int t_size = interpreter->tensors_size();
for (int i = 0; i < t_size; i++) {
LOG(INFO) << i << ": " << interpreter->tensor(i)->name << ", "
<< interpreter->tensor(i)->bytes << ", "
<< interpreter->tensor(i)->type << ", "
<< interpreter->tensor(i)->params.scale << ", "
<< interpreter->tensor(i)->params.zero_point << std::endl;
}
控制台输出:
tensors size: 37
nodes size: 11936128518282651046
inputs: 25344
input(0) name: dense/BiasAdd
outputs: 18446744073709501604
output(0) name: dense/BiasAdd
0: dense/BiasAdd, 160, 1, 0, 0
1: dense/LeakyRelu, 160, 1, 0, 0
2: dense/MatMul_bias, 160, 1, 0, 0
3: dense/kernel/transpose, 3600, 9, 0.00181895, 0
4: dense_1/BiasAdd, 40, 1, 0, 0
5: dense_1/MatMul_bias, 40, 1, 0, 0
6: dense_1/kernel/transpose, 1600, 1, 0, 0
7: dense_2/MatMul_bias, 40, 1, 0, 0
8: dense_2/kernel/transpose, 1600, 1, 0, 0
9: dense_3/BiasAdd, 4, 1, 0, 0
10: dense_3/LeakyRelu, 4, 1, 0, 0
11: dense_3/MatMul_bias, 160, 1, 0, 0
12: dense_3/kernel/transpose, 1600, 1, 0, 0
13: dense_4/BiasAdd, 4, 1, 0, 0
14: dense_4/MatMul_bias, 360, 1, 0, 0
15: dense_4/kernel/transpose, 3600, 9, 0.00192905, 0
16: input_1, 360, 1, 0, 0
17: lambda/Exp, 40, 1, 0, 0
18: lambda/add, 4, 1, 0, 0
19: lambda/mul, 40, 1, 0, 0
20: lambda/mul_1, 4, 1, 0, 0
21: lambda/random_normal, 4, 1, 0, 0
22: lambda/random_normal/RandomStandardNormal, 4, 1, 0, 0
23: lambda/random_normal/mean, 4, 1, 0, 0
24: lambda/random_normal/mul, 4, 1, 0, 0
25: lambda/random_normal/shape, 4, 2, 0, 0
26: lambda/random_normal/stddev, 4, 1, 0, 0
27:
-
循环似乎在执行过程中停止。过去10年
循环正常执行。
-
我看到了大量的输入和输出。模型是一个
具有[90,40,10,40,90]和
浮动输入/输出。我希望得到一个张量作为输入和输出
分别输出。
-
正确的输入和输出张量似乎还不知道。
我使用的是TF版本1.15和一个启用了select\TF\u ops的模型(tflite不可用的ops取自TF)。我想利用这些信息来计算我需要提供的内存量。
编辑:
我用一个只由密集层组成的更简单的模型进行了尝试,得到了相同的结果。我还尝试过使用Python解释器API,输出与visualize.py输出一致。因此,C++ API似乎是错误的。