Невозможно выполнить преобразование между тензором TensorFlowLite с типом STRING и объектом Java - PullRequest
0 голосов
/ 08 марта 2020

Ошибка: java .lang.IllegalArgumentException: Невозможно выполнить преобразование между тензором TensorFlowLite с типом STRING и объектом Java типа [F (который совместим с типом TensorFlowLite FLOAT32).

Я пытаюсь сделать вывод в Android из преобразованной модели tflite. Вот мой код:

    void recognizeImage(Activity activity, float[] pixels) throws IOException {
        MappedByteBuffer model = FileUtil.loadMappedFile(activity, "converted.tflite");
        Interpreter interpreter = new Interpreter(model, new Interpreter.Options());
        float[] output = new float[2];
        interpreter.run(pixels, output);
    }

Вот мой код, экспортирующий сохраненную модель:

    serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
        tf.feature_column.make_parse_example_spec(
            [tf.feature_column.numeric_column('pixels', shape=number_of_pixels)]))
    classifier.export_saved_model(main_dir + 'saved_models/', serving_input_fn)

Вот мой код преобразования:

        # TensorFlow version:  tried with 2.2.0-dev20200128 and 2.2.0-dev20200308
        saved_model_obj = tf.saved_model.load(export_dir=saved_model_dir)
        concrete_func = saved_model_obj.signatures['serving_default']

        converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
        converter.optimizations = [tf.lite.Optimize.DEFAULT]
        converter.experimental_new_converter = True
        converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
                                               tf.lite.OpsSet.SELECT_TF_OPS]

        tflite_model = converter.convert()
        open("converted.tflite", "wb").write(tflite_model)

Android build.gradle:

    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly'

Я видел подобные вопросы о тензорах типа float32 и UINT8 , но не о тензоре типа STRING. На самом деле, я думаю, что тензор моей модели должен быть float32, а не string.

Означает ли это, что преобразование в tflite неверно или неверный код Android?

...