TFLite: Interpreter::Invoke

博客介绍了在调用AllocateTensors后可调用Invoke,说明了Invoke的功能、调用条件及相关注意事项,还给出了Interpreter::Invoke的代码实现。此外,还对OpInvoke进行了解析,包括其功能和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

AllocateTensors调用后就可以调用Invoke


  // Invoke the interpreter (run the whole graph in dependency order).
  //
  // NOTE: It is possible that the interpreter is not in a ready state
  // to evaluate (i.e. if a ResizeTensor() has been performed without an
  // AllocateTensors().
  // Returns status of success or failure.
  TfLiteStatus Invoke();

  TfLiteStatus Interpreter::Invoke() {

    TfLiteStatus status = kTfLiteOk;
  
    // Invocations are always done in node order.
    // Note that calling Invoke repeatedly will cause the original memory plan to
    // be reused, unless either ResizeInputTensor() or AllocateTensors() has been
    // called.
    // TODO(b/71913981): we should force recalculation in the presence of dynamic
    // tensors, because they may have new value which in turn may affect shapes
    // and allocations.
    for (int execution_plan_index = 0;
       execution_plan_index < execution_plan_.size(); execution_plan_index++) {
      if (execution_plan_index == next_execution_plan_index_to_prepare_) {
        TF_LITE_ENSURE_STATUS(PrepareOpsAndTensors());
        TF_LITE_ENSURE(&context_, next_execution_plan_index_to_prepare_ >=
                                      execution_plan_index);
      }
      int node_index = execution_plan_[execution_plan_index];
      TfLiteNode& node = nodes_and_registration_[node_index].first;
      const TfLiteRegistration& registration =
          nodes_and_registration_[node_index].second;
      SCOPED_OPERATOR_PROFILE(profiler_, node_index);

      EnsureTensorsVectorCapacity();
      tensor_resized_since_op_invoke_ = false;
      if (OpInvoke(registration, &node) == kTfLiteError) {
        status = ReportOpError(&context_, node, registration, node_index,
                               "failed to invoke");
      }
   }
}

OpInvoke

// Invoke the operator represented by 'node'.
TfLiteStatus OpInvoke(const TfLiteRegistration& op_reg, TfLiteNode* node) {                                           
    if (op_reg.invoke == nullptr) return kTfLiteError;
    return op_reg.invoke(&context_, node);
}

`tf.lite.Interpreter` 是 TensorFlow Lite(简称 TFLite)提供的一个核心类,用于在运行时解释(即执行)已转换为 TFLite 格式的模型。当模型转换为 INT8(8位整数)精度后,`Interpreter` 类会启用 INT8 加速,利用硬件支持的低精度计算,加快推理速度,特别是对于那些对性能敏感的应用,如移动设备或物联网设备。 在使用 `tf.lite.Interpreter` 的 INT8 版本时,需要注意以下几点: 1. **量化数据**:你需要提供一组代表原始模型输入数据范围的示例数据(代表数据集),这个数据会被用于量化过程中确定每个输入维度的最大和最小值,以便于后续推理时使用正确的量化范围。 2. **初始化 interpreter**:创建 `Interpreter` 实例,并指定量化后的 `.tflite` 文件路径作为参数。 ```python interpreter = tf.lite.Interpreter(model_path='int8_model.tflite') ``` 3. **设置输入和输出类型**:调用 `set_input_arrays()` 和 `set_output_arrays()` 来设置处理的输入和输出张量索引,然后通过 `set_tensor` 函数设置量化后的输入数据。 ```python interpreter.allocate_tensors() input_details = interpreter.get_input_details()[0] output_details = interpreter.get_output_details()[0] input_data_int8 = ... # 根据量化范围转换成INT8数据 interpreter.set_tensor(input_details['index'], input_data_int8) ``` 4. **推理**:调用 `invoke()` 执行模型推理操作。 ```python interpreter.invoke() ``` 5. **获取结果**:从输出详情中提取张量数据。 ```python output_data_int8 = interpreter.get_tensor(output_details['index']) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值