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

Android TensorFlow Lite解释器:如何修复"DataType错误:无法解决java.lang.浮点数的DataType"

穆阳嘉
2023-03-14

运行TFLite解释器时,将包含浮点数的ByteBuffer作为输入,应用程序会引发异常:

"数据类型错误:无法解析java.lang.浮点数的数据类型"

模型本身在Keras上进行训练,然后转换为TF,然后再转换为TFLite。

对于转换,我使用了TF(1.5.0版)toco转换器。

toco的输入参数:

toco——输入文件=已转换。pb—输出文件=模型。tflite--输入\格式=TENSORFLOW \ GRAPHDEF--输入\形状=1224224,3--输入\数组=主\输入--输出\数组=主\输出/Sigmoid--推断\类型=浮点--输出\格式=tflite--输入\类型=浮点

代替ByteBuffer,我还手动创建了一个浮点[][][][] 数组,其尺寸预计由模型输入:[1,224,224,3]

导致与ByteBuffer相同的错误。

请注意,我将浮点除以255,以获得[0,1]范围内的像素值。

import org.tensorflow.lite.Interpreter;
import java.nio.ByteBuffer;


public Interpreter tflite;

tflite = new Interpreter(loadModelFile(Test_TFLite.this,modelFile));

ByteBuffer bytebuffer_float = convertBitmapToByteBuffer_float(image, 1, 
    224, 3);

float out = 0;

tflite.run(bytebuffer_float,out);


private ByteBuffer convertBitmapToByteBuffer_float(Bitmap bitmap, int 
    BATCH_SIZE, int inputSize, int PIXEL_SIZE) {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * BATCH_SIZE * 
    inputSize * inputSize * PIXEL_SIZE); //float_size = 4 bytes
        byteBuffer.order(ByteOrder.nativeOrder());
        int[] intValues = new int[inputSize * inputSize];
        bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, 
    bitmap.getWidth(), bitmap.getHeight());
        int pixel = 0;
        for (int i = 0; i < inputSize; ++i) {
            for (int j = 0; j < inputSize; ++j) { 
                final int val = intValues[pixel++];


                byteBuffer.putFloat( ((val >> 16) & 0xFF)* (1.f/255.f)); 
                byteBuffer.putFloat( ((val >> 8) & 0xFF)* (1.f/255.f)); 
                byteBuffer.putFloat( (val & 0xFF)* (1.f/255.f)); 
            }
        }
        return byteBuffer;
    }

我期望一个范围[0,1]内的单个浮点值作为输出。由于解释器抛出异常,因此没有实际输出。

"数据类型错误:无法解析java.lang.浮点数的数据类型"

共有1个答案

澹台岳
2023-03-14

我从来没有用过TF-LiteJava自己。但是,根据文档,tflite.run()的两个参数都必须是张量。但是对于输出参数,您只传递一个浮点。所以,我很确定这是您错误“无法解析java.lang.浮点数的数据类型”的根本原因。

注:根据文档,还支持原始ByteBuffers以及支持的数据类型的多维数组(floatintlongbyte)。因此,您的两种方法,ByteBufferfloat[][]都应该有效。您只需对输出执行相同的操作。

 类似资料:
  • 当运行TFLite解释器将包含浮点的ByteBuffer作为输入时,应用程序抛出一个异常: “数据类型错误:无法解析java.lang.float的数据类型” 模型本身是在Keras上训练的,然后转换成TF,再转换成TFLITE。 我希望有一个范围为[0,1]的浮点值作为输出。解释器抛出异常时没有实际输出。 “数据类型错误:无法解析java.lang.float的数据类型”

  • 我正在尝试创建一个JupyterLab扩展,它使用typescript。 我已经成功地添加了包“@类型/节点”,允许我使用诸如“要求”(“超文本传输协议”)这样的包。 但一旦我尝试使用子进程,使用“require”(“child_process”),我在尝试构建扩展时就会出现以下错误。 我在谷歌上搜索过,但仍然不知道如何解决这个问题。 如有任何提示或信息,将不胜感激。 我的包裹。json文件。

  • 现在我正在尝试从git运行克隆应用程序https://github.com/frinder/frinder-app但问题是该应用程序制作了很长时间,所以应该改变bulid.gradle 但是当我尝试相同的同步实现“com.android.支持:动画矢量可绘制:28.0.0”,但如果我删除它,请继续向我显示错误28.0.0它显示如下 但我不知道是什么造成了不完全相同的版本 这是应用程序build.g

  • 我不熟悉node。js。这是我的包裹。json文件 在heroku服务器上,我得到了这些错误日志 我在npm git上收到这些错误。谁能解决这个问题。 0信息如果以“确定”结尾,则有效 1 verbose cli[“C:\Program Files\nodejs\\node.exe”, 1详细的cli'C:\Program Files\nodejs\node_modules\npm\bin\npm

  • 我正试图为Spring编写一个Junit测试用例,经过大量阅读,我得到了一个返回text/plain的方法的所有工作。当我试图返回application/json时,遇到了问题。 关于SO的共识似乎是:使用mvc:注释驱动。我尝试了这个(通过创建spring-web-servlet.xml如下所示根据这里。然而,这并没有解决我的问题。有人知道我还做错了什么吗? SpringWebservlet。x

  • 问题内容: 我们有一个使用AJAX的Sharepoint解决方案。触发此操作的按钮在更新面板中。 我们要做的一件事是生成MS Word文档,然后在客户端上打开该文档,以便可以打印它。 将文档发送到客户端的代码如下所示: 我们得到的错误是: 我们可以先将文档保存在Sharepoint中,然后再从Sharepoint中打开它,但是我们不希望这样做。 问题答案: 导致该代码执行的动作必须是回发事件,而不