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"
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 output
argumento está de paso una sola float
solamente. 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 ByteBuffer
s, así como matrices multidimensionales de los tipos de datos soportados ( float
, int
, long
, byte
) están soportados. Por lo tanto, ambos de sus enfoques, ByteBuffer
y float[][][][]
debería funcionar. Sólo tiene que hacer lo mismo para la salida.