Android TensorFlow Lite intérprete: Cómo arreglar el "Tipo de datos de error: no puede resolver tipo de datos de java.lang.Float"

Moritz:

Cuando se ejecuta el intérprete TFLite dando como entrada una flota ByteBuffer que contienen, la aplicación emite una excepción:

"Error de Tipo de datos: Tipo de datos no puede resolver de java.lang.Float"

El modelo en sí mismo fue entrenado en Keras, convierte a continuación en TF y luego a TFLite.

Para la conversión he utilizado el TF (versión 1.5.0) toco convertidor.

Parámetros de entrada para 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 / sigmoide --inference_type = FLOAT --output_format = TFLITE - -input_type = FLOAT

En lugar de la ByteBuffer I también han creado manualmente a [] [] [] [] array flotador con dimensiones esperadas como entrada por el modelo: [1,224,224,3]

Conduce al mismo error que el ByteBuffer.

Tenga en cuenta que estoy dividiendo la flota por 255 para obtener los valores de los píxeles en el rango de [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;
    }

I esperar que un solo valor flotante en el rango [0,1] como una salida. No hay una salida real como el intérprete lanza una excepción.

"Error de Tipo de datos: Tipo de datos no puede resolver de java.lang.Float"

sebrockm:

Nunca he usado TF-Lite para Java mí mismo. Pero, de acuerdo con los documentos , ambos argumentos de tflite.run()tienen que ser tensores. Pero para el outputargumento está de paso una sola floatsolamente. Por lo tanto, estoy bastante seguro de que esta es la causa de su error "No se puede resolver el tipo de datos de java.lang.Float".

Nota: también de acuerdo con los documentos, primas ByteBuffers, así como matrices multidimensionales de los tipos de datos soportados ( float, int, long, byte) están soportados. Por lo tanto, ambos de sus enfoques, ByteBuffery float[][][][]debería funcionar. Sólo tiene que hacer lo mismo para la salida.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=211888&siteId=1
Recomendado
Clasificación