我在使用 Tensorflow-for-poets-2 TFLite 教程中的 MappedByteBuffer 方法加载 TFLite 模型时遇到问题。
private MappedByteBuffer loadModelFile(Activity activity,String MODEL_FILE) throws IOException {
AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(MODEL_FILE);
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
FileChannel fileChannel = inputStream.getChannel();
long startOffset = fileDescriptor.getStartOffset();
long declaredLength = fileDescriptor.getDeclaredLength();
return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
特别是当返回 fileChannel.map 时,我使用 tflite_convert(以前的 toco)工具转换的模型会失败。该模型是浮点 TFLite 模式。
该问题似乎是由 startOffset 和 declaredLength 变量引起的。我在 logcat 中收到的错误是
7525-7525/dp.thexor A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 7525 (dp.thexor), pid 7525 (dp.thexor)
如果我将这些值修复为成功加载的模型中的值,则该方法成功返回 fileChannel.map。我的模型中的值是 startOffset = 2846788 declaredLength = 45525464
我知道我的 TFlite 模型可以成功映射到内存,因为 tensorflow/contrib/lite/tools/benchmark:benchmark_model 能够对其进行基准测试。
我会尝试加载量化的 TFLite 模型,但目前我的模型包含没有量化等价物(transpose_conv)的操作。
这可能是什么原因造成的?
我的 .tflite 模型可以在这里找到:https ://github.com/andrewginns/CycleGAN-Tensorflow-PyTorch/releases/download/tf1.7-py3.6.4/float.tflite