当前位置: 首页 > 知识库问答 >
问题:

无法在android studio中的Interpreter上运行tflite模型

东郭思远
2023-03-14

我正在尝试在智能手机上的应用程序上运行张量流精简模型。首先,我使用 LSTM 用数值数据训练模型,并使用张量流.Keras 构建模型层。我使用了 TensorFlow V2.x 并将训练的模型保存在服务器上。之后,该模型由应用程序下载到智能手机的内部存储器,并使用“映射字节缓冲区”加载到解释器。直到这里一切正常。

问题在于解释器无法读取和运行模型。我还在 build.gradle 上添加了所需的依赖项。

在蟒蛇中转换为 tflite 模型的代码:

from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
from tensorflow.keras import regularizers
#Create the network
model = Sequential()
model.add(LSTM(...... name = 'First_layer'))
model.add(Dropout(rate=Drop_out))
model.add(LSTM(...... name = 'Second_layer'))
model.add(Dropout(rate=Drop_out))

# compile model
model.compile(loss=keras.losses.mae, 
optimizer=keras.optimizers.Adam(learning_rate=learning_rate), metrics=["mae"])

# fit model
model.fit(.......)
#save the model
tf.saved_model.save(model,'saved_model')
print("Model  type", model1.dtype)# Model type is float32 and size around 2MB

#Convert saved model into TFlite
converter = tf.lite.TFLiteConverter.from_saved_model('saved_model')
tflite_model = converter.convert()

with open("Model.tflite, "wb") as f:
    f.write(tflite_model)
f.close()

我还尝试了其他使用Keras的转换方式

# converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
# tflite_model = converter.convert()

在这一步之后,“Model.tflite”被转换并下载到智能手机的内存中。

Android studio代码:

  try {
        private Interpreter tflite = new Interpreter(loadModelFile());
        Log.d("Load_model", "Created a Tensorflow Lite of AutoAuth.");

    } catch (IOException e) {
        Log.e("Load_model", "IOException loading the tflite file");

    }

private MappedByteBuffer loadModelFile() throws IOException {
    String model_path = model_directory + model_name + ".tflite";
    Log.d(TAG, model_path);
    File file = new File(model_path);
    if(file!=null){
    FileInputStream inputStream = new FileInputStream(file);
    FileChannel fileChannel = inputStream.getChannel();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
    }else{
        return null;
    }
}

“loadModelFile()”函数工作正常,因为我使用MNIST数据集对图像进行分类的另一个tflite模型进行了检查。问题只在于口译员。

这也是构建的。梯度内容:

android {
aaptOptions {
    noCompress "tflite"
}
 }
  android {
     defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
      }
    }

dependencies {
     implementation 'com.jakewharton:butterknife:8.8.1'
     implementation 'org.tensorflow:tensorflow-lite:0.1.2-nightly'
     annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     //noinspection GradleCompatible
     implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:2.0.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }

或者

2-

我浏览了许多资源和线程,阅读了关于保存训练模型、TFlite转换和解释器的内容。我在5天前试图解决这个问题,但没有希望。对此有人能给出解决方案吗?

共有2个答案

胡锋
2023-03-14

loadMepdFile有impl在tsorflow lite utils

java prettyprint-override">import org.tensorflow.lite.support.common.FileUtil;

    MappedByteBuffer tfliteModel = FileUtil.loadMappedFile(activity, getModelPath());
臧正平
2023-03-14

参考最新的TfLiteAndroid应用程序示例之一可能会有所帮助:模型个性化应用程序。此演示应用使用迁移学习模型而不是 LSTM,但整体工作流程应该相似。

正如Farmaker在评论中提到的,尝试在gradle依赖项中使用SNAPSHOT:

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'

要正确加载模型,您可以尝试:

java prettyprint-override">protected MappedByteBuffer loadMappedFile(String filePath) throws IOException {
    AssetFileDescriptor fileDescriptor = assetManager.openFd(this.directoryName + "/" + filePath);

    FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
    FileChannel fileChannel = inputStream.getChannel();
    long startOffset = fileDescriptor.getStartOffset();
    long declaredLength = fileDescriptor.getDeclaredLength();
    return fileChannel.map(MapMode.READ_ONLY, startOffset, declaredLength);
  }

这个片段也可以在我上面发布的GitHub示例链接中找到。

 类似资料:
  • 我有一个量化的tflite模型,我想在Nvidia Jetson Nano上进行推理。我使用tf.lite。用于推理的解释器()方法。这个过程似乎没有在GPU上运行,因为CPU和GPU上的推理时间是相同的。 有没有办法使用Python在GPU上运行tflite模型? 我试图通过设置tf来强制使用GPU。device()方法,但仍然不起作用。官方文档中有一个叫做GPU加速委托的东西,但我似乎找不到任

  • 您能帮助在android studio中运行默认java而不是gradle执行吗?谢谢

  • 我按照TensorFlow lite的指示在Android上创建了一个对象检测应用程序,我的tflite模型在笔记本电脑上测试时成功运行。但是,当我用我的tflite模型替换示例应用程序中的tflite模型时,它无法检测到任何东西。 还有什么我需要做的吗?请帮帮我,我已经陷入这种情况一个星期了。

  • 模拟器从VS代码中顺利打开,但是当我试图运行应用程序代码时,它抛出了一个很长的错误! 1 错误 > 尝试:使用 --堆栈跟踪选项运行以获取堆栈跟踪。使用 --info 或 --调试选项运行以获取更多日志输出。运行 --scan 以获取完整的见解。 获取更多帮助,请访问https://help.gradle.org 构建在3秒内失败 错误 无法安装应用程序。确保您已设置Android开发环境:htt

  • 根据来自的说明,我已将tensorflow推理图转换为tflite模型文件(*.tflite)https://www.tensorflow.org/lite/convert. 我在我的GPU服务器上测试了tflite模型,该服务器有4个Nvidia TITAN GPU。我使用了tf.lite。解释器加载并运行tflite模型文件。 它与以前的张量流图一样工作,然而,问题是推理变得太慢了。当我检查原