yung7086 2024-04-30 11:21 采纳率: 60%
浏览 8

android 调用 Tensorflow的模型出错了

android 调用 Tensorflow的模型出错了.错误日志


```kotlin
FATAL EXCEPTION: main
    Process: com.vvfly.GsensorTest1, PID: 1790
    java.lang.IllegalStateException: Internal error: Unexpected failure when preparing tensor allocations:
    tensorflow/lite/kernels/expand_dims.cc:40 axis >= 0 was not true.
    Node number 0 (EXPAND_DIMS) failed to prepare.
    at org.tensorflow.lite.NativeInterpreterWrapper.allocateTensors(Native Method)
    at org.tensorflow.lite.NativeInterpreterWrapper.allocateTensorsIfNeeded(NativeInterpreterWrapper.java:303)
    at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:243)
    at org.tensorflow.lite.InterpreterImpl.runForMultipleInputsOutputs(InterpreterImpl.java:133)
    at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:80)
    at org.tensorflow.lite.InterpreterImpl.run(InterpreterImpl.java:126)
    at org.tensorflow.lite.Interpreter.run(Interpreter.java:80)
    at com.example.nrfc.BreathAIProcess.setDate(BreathAIProcess.java:121)
    at com.example.nrfc.MainActivity$14$3.run(MainActivity.java:837)
    at android.app.Activity.runOnUiThread(Activity.java:7785)
    at com.example.nrfc.MainActivity$14.onReceive(MainActivity.java:775)
    at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:308)
    at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
    at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:118)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loopOnce(Looper.java:232)
    at android.os.Looper.loop(Looper.java:317)
    at android.app.ActivityThread.main(ActivityThread.java:8501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)



加载模型的代码:

    interpreter = new Interpreter(loadModelFile(mContext));

    // 加载模型文件
    private MappedByteBuffer loadModelFile(Context context) throws IOException {
        AssetFileDescriptor fileDescriptor = context.getAssets().openFd("model1.26-0.50.tflite");
        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);
    }



这是我使用tensorflow的版本
    implementation 'org.tensorflow:tensorflow-lite:2.10.0'
//    implementation 'org.tensorflow:tensorflow-lite:+'

    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:2.10.0'





  • 写回答

3条回答 默认 最新

  • 专家-皆知 2024-04-30 11:21
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    这个错误信息表明你的TensorFlow Lite模型在准备过程中遇到了问题,具体是由于EXPAND_DIMS操作的参数axis没有满足非负值的要求。这意味着你的模型期望在某个维度上进行扩展,但提供的轴索引是负数,这是不允许的。

    为了解决这个问题,你需要检查以下几个方面:

    1. 模型输入形状:首先确认你的输入数据是否与模型预期的输入形状相匹配。模型可能要求在特定维度上添加一个新的维度(例如,将一个一维向量转换为二位矩阵),而你的数据可能没有正确地预处理。

    2. 模型定义:如果你自己定义了模型,检查tf.expand_dims的使用,确保axis参数的值在运行时不会是负数。如果是使用Keras,确保类似tf.keras.layers.Lambda(tf.expand_dims, arguments={'axis': some_positive_int})中的some_positive_int是正确的。

    3. 数据预处理:在将数据送入模型之前,确保进行了正确的预处理。如果你需要在某个维度上扩展数据,确保这个操作是正确的,并且axis值是合法的。

    4. 模型适配:如果你的模型是从其他来源获取的,确认模型文档或源代码中关于输入数据的形状要求,并相应调整你的数据。

    针对你的代码,虽然没有直接展示数据预处理部分,但是解决方法通常涉及修改数据预处理逻辑。下面是一个简化的示例,展示了如何正确准备数据,假设你需要将一个一维数组作为模型的输入,而模型需要二维输入:

    // 假设inputData是一维的数据数组,需要调整为模型所需的形状
    float[] inputData = ...; // 你的数据
    int inputSize = inputData.length;
    TensorBuffer inputBuffer = TensorBuffer.createFixedSize(new int[]{1, inputSize}, DataType.FLOAT32);
    inputBuffer.loadArray(inputData, new int[]{0, 0}); // 这里假设需要在第一个维度(axis=0)添加新维度
    
    // 确保模型输出的处理也是正确的,这里不展示具体输出处理代码
    
    try {
        interpreter.run(inputBuffer.getBuffer(), outputBuffer.getBuffer().rewind()); // 运行模型
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    如果你的问题在于模型本身对数据的期待与实际提供不符,上述代码段演示了如何手动确保输入数据的维度正确,避免在模型内部进行无效的expand_dims操作导致的错误。

    如果问题依旧,建议详细审查模型的输入输出要求,并且可以尝试打印或调试检查数据预处理步骤,确保在喂给TensorFlow Lite模型之前数据的形状完全符合模型的预期。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月30日

悬赏问题

  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥15 有关于推荐系统jupyter
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据
  • ¥15 关于树的路径求解问题
  • ¥15 yolo在训练时候出现File "D:\yolo\yolov5-7.0\train.py"line 638,in <module>