java - 如何从内部存储加载Tensorflow模型?

标签 java android tensorflow

我想知道是否可以从 Android 设备的内部存储而不是 Assets 文件夹中存储和读取经过训练的 .tflite 模型?

下面是用于从 Assets 文件夹加载模型的原始代码(有效)。

private MappedByteBuffer loadLocalModelFile() throws IOException {
  AssetFileDescriptor fileDescriptor = getAssets().openFd(MODEL_PATH);
  FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
  long startOffset = fileDescriptor.getStartOffset();
  long declaredLength = fileDescriptor.getDeclaredLength();

  FileChannel fileChannel = inputStream.getChannel();
  return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}

有没有办法从内部存储器加载模型,并且仍然获取 fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength) 的 startOffset 和 declaredLength ?如果没有,有没有办法在从内部存储读取原始二进制文件时计算新模型的 startOffset 及其声明的长度?

我尝试使用 AssetManager 中的 openNonAssetFd() 函数来获取位于内部存储中的文件的 AssetFileDescriptor。

private MappedByteBuffer loadOnlineModelFile() throws IOException {
    FileInputStream inputStream = openFileInput(MODEL);

    AssetManager manager = getAssets();
    AssetFileDescriptor afd = manager.openNonAssetFd(getFilesDir() + "/graph.lite");

    long startOffset = afd.getStartOffset();
    long declaredLength = afd.getDeclaredLength();

    FileChannel fileChannel = inputStream.getChannel();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
  }

但是,这将导致“java.lang.IllegalArgumentException:Model ByteBuffer 应该是模型文件的 MappedByteBuffer 或使用包含模型内容字节的 ByteOrder.nativeOrder() 的直接 ByteBuffer”和“java.io.FileNotFoundException”。

最佳答案

嗯,我到处寻找,终于弄清楚了。非常简单。
出于某种原因,我认为 AssetFileDescriptor 的 getStartOffset 与实际的 tflite 模型相关,但事实并非如此。我认为 getStartOffset 给出了应用程序 Assets 中文件的起始点。对于 tflite 模型startOffset 应该为 0,因为这是文件开始的位置,因为它只是一个文件。 所以,代码应该是

File file = new File('path_to_model');
FileInputStream is = new FileInputStream(file);

return is.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());

关于java - 如何从内部存储加载Tensorflow模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56960073/

相关文章:

javascript - React-Native 多行 TextInput 组件 : how to allow scroll when editable set to false

python - 使用 bool 掩码从两个较小的张量创建 TensorFlow 张量

swift - S4TF 中的 softmax 交叉熵

java - 将数字拆分为整数和小数

java - 常量接口(interface)反模式说明

java - 如何让 hadoop wordcount 示例正常工作?

java - 使用 Java Fitnesse 进行 XML 输入/输出

android - 如何使用回收站 View 的支持版本而不是Androidx

java - 当 Activity 在其 AsyncTask 运行时被销毁时,内存中会发生什么?

python - 使用 keras 和 Flask 加载模型时出错