博客
关于我
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/

    你可能感兴趣的文章
    neuroph轻量级神经网络框架
    查看>>
    Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
    查看>>
    new Blob()实现不同类型的文件下载功能
    查看>>
    New Concept English three (35)
    查看>>
    NEW DATE()之参数传递
    查看>>
    New Journey--工作五年所思所感小记
    查看>>
    new Queue(REGISTER_DELAY_QUEUE, true, false, false, params)
    查看>>
    New Relic——手机应用app开发达人的福利立即就到啦!
    查看>>
    new work
    查看>>
    new 一个button 然后dispose,最后这个button是null吗???
    查看>>
    NewspaceGPT的故事续写能力太强了
    查看>>
    NewspaceGPT绘制时序图
    查看>>
    NewspaceGPT绘制类图
    查看>>
    new一个对象的过程
    查看>>
    new和delete用法小结
    查看>>
    new对象时,JVM内部究竟藏了什么小秘密?
    查看>>
    new操作符的实现原理
    查看>>
    Next.js React Server Components 教程
    查看>>
    NextGen Mirth Connect XStream反序列化远程代码执行漏洞(CVE-2023-43208)
    查看>>
    next项目部署到服务器pm2进程守护
    查看>>