博客
关于我
TFLite: 代码分析(1): 获得模型文件 flatbuffers对象
阅读量:757 次
发布时间:2019-03-23

本文共 3908 字,大约阅读时间需要 13 分钟。

TensorFlow Lite Java 层代码组成

TensorFlow Lite 的 Java 层是一个用于在移动设备上运行机器学习模型的强大框架。它通过 Java API 提供了一种高效的方式来加载和执行预训练模型,而无需依赖大型计算资源。以下是 TensorFlow Lite Java 层的核心代码组成和相关实现。


1. 核心文件组成

TensorFlow Lite 的 Java 层主要包含以下文件:

  • DataType.java: 定义了 TensorFlow Lite 中 Tensor 的元素类型。这包括了 flatbuffers 支持的基本数据类型,如 int、long、float、double 等。

  • Delegate.java: 作为 TensorFlow Lite Delegate 的代理接口,它只是一个抽象接口,具体的实现需要通过 Native 方法来获取。

  • Interpreter.java: 主要负责模型 inference 的驱动类。这类 Interpreter 给解 TensorFlow Lite 模型,执行相关操作并进行数据推理。

  • NativeInterpreterWrapper.java: 内部用来包装 native 解释器,控制模型执行。这是一个内部接口,负责与 native method 调用并处理模型相关的低层操作。

  • Tensor.java: 定义了多维数组(Tensor),用于在 TensorFlow Lite 中表示数据。这是机器学习模型中的核心数据结构。

  • TensorFlowLite.java: 提供静态方法来加载 TensorFlow Lite 运行时环境。这类方法常用于初始化模型和配置。

  • package-info.java: 这个文件通常用于包级信息,比如版本控制或扩展说明。


  • 2. Interpreter.java 的接口

    Interpreter 是一个核心类,主要通过以下方式进行操作:

    1. 引入 Options 类

    Options 类用于控制运行时的解释器行为,常见包括:

    • 设置用于多线程操作的线程数量。-启用或禁用 NN API(针对支持 NNAPI 的设备)。
    • 允许使用 FP32 到 FP16 的下降精度计算。
    • 添加 Delegate 实例,以提高模型执行效率。

    2. NNAPI 与 Delegate

    NNAPI 是 Android Neural Networks API 的缩写,是一种优化模型执行的加速 API。Delegate 是将部分或全部图形执行重定向到另一个执行器的方法,适用于具有硬件加速的设备(如 GPU 或 DSP)。

    3. Interpreter 的实现

    从代码实现来看,Interpreter 的构造函数主要负责加载模型文件和配置选项。其核心逻辑包括:

    public Interpreter(@NonNull ByteBuffer byteBuffer, Options options) {    this.wrapper = new NativeInterpreterWrapper(byteBuffer, options);}

    这里的 wrapper 是一个 Java 对象,负责调用 native method。其中,NativeInterpreterWrapper 是一个内部接口,负责模型文件的加载和解释。


    4. NativeInterpreterWrapper 的实现

    NativeInterpreterWrapper 类负责向 Java.wp层调用 native method,具体涉及以下几个关键步骤:

    1. createModelWithBuffer 方法

    private static native long createModelWithBuffer(ByteBuffer modelBuffer, long errorHandle);

    这个方法通过 JNI 接口调用 native 实现,主要完成模型文件的加载和解释。具体实现如下:

    JNIEXPORT jlong JNICALLJava_org_tensorflow_lite_NativeInterpreterWrapper_createModelWithBuffer(    JNIEnv* env, jclass clazz, jobject model_buffer, jlong error_handle) {    BufferErrorReporter* error_reporter = convertLongToErrorReporter(env, error_handle);    const char* buf = static_cast
    (env->GetDirectBufferAddress(model_buffer)); jlong capacity = env->GetDirectBufferCapacity(model_buffer); auto model = tflite::FlatBufferModel::BuildFromBuffer(buf, static_cast
    (capacity), error_reporter); return reinterpret_cast
    (model.release());}

    2. createInterpreter 方法

    private void init(long errorHandle, long modelHandle, Interpreter.Options options) {    this.errorHandle = errorHandle;    this.modelHandle = modelHandle;    this.interpreterHandle = createInterpreter(modelHandle, errorHandle, options.numThreads);    // 分配输入和输出张量    this.inputTensors = new Tensor[getInputCount(interpreterHandle)];    this.outputTensors = new Tensor[getOutputCount(interpreterHandle)];    allocateTensors(interpreterHandle, errorHandle);    this.isMemoryAllocated = true;}

    5. JNI 层的实现

    如前所述,JNI 的主要功能是桥接 Java 与 native 方法。以下是 createErrorReporter 的实现:

    JNIEXPORT jlong JNICALLJava_org_tensorflow_lite_NativeInterpreterWrapper_createErrorReporter(    JNIEnv* env, jclass clazz, jint size) {    BufferErrorReporter* error_reporter = new BufferErrorReporter(env, static_cast
    (size)); return reinterpret_cast
    (error_reporter);}

    6. Allocation 类

    Allocation 类负责模型文件的内存管理。其核心实现包括:

    class MemoryAllocation : public Allocation {public:    MemoryAllocation(const void* ptr, size_t num_bytes, ErrorReporter* error_reporter) :        Allocation(error_reporter) {        buffer_ = ptr;        buffer_size_bytes_ = num_bytes;    }    ~MemoryAllocation() {}    const void* base() const override { return buffer_; }    size_t bytes() const override { return buffer_size_bytes_; }    bool valid() const override { return true; }private:    const void* buffer_;    size_t buffer_size_bytes_ = 0;}

    总结

    通过以上代码实现可以看出,TensorFlow Lite 的 Java 层主要通过 InterpreterNativeInterpreterWrapper 这两个类完成模型加载与执行。核心逻辑在于 JNI 调用 native 实现,优化模型运行效率,同时支持硬件加速和多线程执行。理解这些实现可以帮助开发者更好地利用 TensorFlow Lite 在移动设备上的高效运行能力。

    转载地址:http://bcuzk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>
    mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    查看>>
    MySQL 快速创建千万级测试数据
    查看>>
    mysql 快速自增假数据, 新增假数据,mysql自增假数据
    查看>>
    MySql 手动执行主从备份
    查看>>
    Mysql 批量修改四种方式效率对比(一)
    查看>>
    Mysql 报错 Field 'id' doesn't have a default value
    查看>>
    MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
    查看>>
    Mysql 拼接多个字段作为查询条件查询方法
    查看>>
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>