java - Android TensorFlow Lite 解释器 : How to fix "DataType error: cannot resolve DataType of java.lang.Float"

标签 java android tensorflow tensorflow-lite

当运行 TFLite 解释器并提供包含 float 的 ByteBuffer 作为输入时,应用程序会抛出异常:

“数据类型错误:无法解析 java.lang.Float 的数据类型”

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

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

toco 的输入参数:

toco --input_file=converted.pb --output_file=model.tflite --input_format=TENSORFLOW_GRAPHDEF --input_shape=1,224,224,3 --input_array=main_input --output_array=main_output/Sigmoid --inference_type=FLOAT --output_format =TFLITE --input_type= float

我还手动创建了一个 float[][][][] 数组,而不是 ByteBuffer,其尺寸为模型输入的预期尺寸:[1,224,224,3]

导致与 ByteBuffer 相同的错误。

请注意,我将 float 除以 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.Float 的数据类型”

最佳答案

我自己从未使用过 TF-Lite for Java。 但是,根据 docstflite.run() 的两个参数都必须是张量。但是对于 output 参数,您只传递了一个 float。所以,我很确定这是错误“无法解析 java.lang.Float 的数据类型”的根本原因。

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

关于java - Android TensorFlow Lite 解释器 : How to fix "DataType error: cannot resolve DataType of java.lang.Float",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235468/

相关文章:

android - 下拉项的 AutoCompleteTextView 边距

android - 使用 HTML5 标签播放视频

java - 为什么 Joda DateTimeFormatter 无法解析时区名称 ('z' )

java - 如何在android中将所有图像从一个文件夹移动到另一个文件夹

java - 我可以开发IP-messenger(LAN连接的计算机用户之间的消息/聊天)

android - Cordova - 未找到 Android SDK

tensorflow - Tensorflow 或 Keras 中的离散权重和激活

python - 是什么导致训练准确度和 epoch 之间损失的大幅跃升?

tensorflow - 推理时 tensorflow 中的批量归一化

java - IntelliJ IDEA 中的 Ctrl-tab