代码之家  ›  专栏  ›  技术社区  ›  DocDriven

用C++ API检验TFLITE模型产生不可追踪的结果

  •  0
  • DocDriven  · 技术社区  · 6 年前

    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似乎是错误的。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Joost Sannen    6 年前

    我通过交叉编译我的应用程序解决了这个问题,使用的工具链与我用来构建tensorflow的工具链相同。让一切恢复正常。

        2
  •  -1
  •   Yunlu Li    6 年前

    在构建解释器之后,是否可以尝试添加这两行:

    然后检查模型。

    推荐文章