Android Firebase本地模型抛出“;没有';无法找到内置操作码的op';CONV#u 2D';版本';2'&引用;

Android Firebase本地模型抛出“;没有';无法找到内置操作码的op';CONV#u 2D';版本';2'&引用;,android,firebase,tensorflow,tensorflow-lite,Android,Firebase,Tensorflow,Tensorflow Lite,我得到了一个像这样的模型,并对它进行了训练: keras.layers.Conv2D(128, (3,3), activation='relu', input_shape=(150,150,3)), keras.layers.MaxPooling2D(2,2), keras.layers.Dropout(0.5), keras.layers.Conv2D(256, (3,3), activation='relu'),

我得到了一个像这样的模型,并对它进行了训练:

      keras.layers.Conv2D(128, (3,3), activation='relu', input_shape=(150,150,3)),
      keras.layers.MaxPooling2D(2,2),
      keras.layers.Dropout(0.5),
      
      keras.layers.Conv2D(256, (3,3), activation='relu'),
      
      keras.layers.MaxPooling2D(2,2), 
     
      keras.layers.Conv2D(512, (3,3), activation='relu'),
      
      keras.layers.MaxPooling2D(2,2),
     
      keras.layers.Flatten(),
          
      keras.layers.Dropout(0.3),      
      
      keras.layers.Dense(280, activation='relu'),
      
      keras.layers.Dense(4, activation='softmax')
    ])
我使用以下代码将其转换为.tflite:

import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("model.h5")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.post_training_quantize=True
converter.allow_custom_ops=True

tflite_model = converter.convert()

open("model.tflite", "wb").write(tflite_model)
然后我希望它与本地Firebase一起使用:

 val bitmap = Bitmap.createScaledBitmap(image, 150, 150, true)

        val batchNum = 0
        val input = Array(1) { Array(150) { Array(150) { FloatArray(3) } } }
        for (x in 0..149) {
            for (y in 0..149) {
                val pixel = bitmap.getPixel(x, y)
                input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 255.0f
                input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 255.0f
                input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 255.0f
            }


        }
        val localModel = FirebaseCustomLocalModel.Builder()
            .setAssetFilePath("model.tflite")
            .build()
val interpreter = FirebaseModelInterpreter.getInstance(FirebaseModelInterpreterOptions.Builder(localModel).build())
                val inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
                    .setInputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 150, 150, 3))
                    .setOutputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 4))
                    .build()

                val inputs = FirebaseModelInputs.Builder()
                    .add(input)
                    .build()
                interpreter?.run(inputs, inputOutputOptions)
                    ?.addOnSuccessListener { result ->
                        val output = result.getOutput<Array<FloatArray>>(0)
                        val probabilities = output[0]





有人知道我做错了什么?我使用的是tensorflow gpu和tensorflow estimator 2.3.0

TFLite操作符有不同的功能。看起来您已使用较新版本的Conv2D转换了模型,而您当前的解释器不支持该模型

我在Android上遇到过这个问题,当时我尝试了
converter.optimizations=[tf.lite.Optimize.DEFAULT]
。因此,我建议您在开始时放弃优化和定制操作:

import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("model.h5")
converter.optimizations = []
converter.post_training_quantize=True
converter.allow_custom_ops=False

tflite_model = converter.convert()

open("model.tflite", "wb").write(tflite_model)
编辑: 在转换模型和应用程序时,还要确保使用相同版本的Tensorflow。旧版本的解释器不支持新的op版本,导致版本不匹配。
编辑2(可能更有用):
尝试使用旧版本的Tensorflow转换模型,例如使用以下命令:

import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("model.h5")
converter.optimizations = []
converter.allow_custom_ops=False
converter.experimental_new_converter = True

tflite_model = converter.convert()

TFLite运算符具有不同的属性。看起来您已使用较新版本的Conv2D转换了模型,而您当前的解释器不支持该模型

我在Android上遇到过这个问题,当时我尝试了
converter.optimizations=[tf.lite.Optimize.DEFAULT]
。因此,我建议您在开始时放弃优化和定制操作:

import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("model.h5")
converter.optimizations = []
converter.post_training_quantize=True
converter.allow_custom_ops=False

tflite_model = converter.convert()

open("model.tflite", "wb").write(tflite_model)
编辑: 在转换模型和应用程序时,还要确保使用相同版本的Tensorflow。旧版本的解释器不支持新的op版本,导致版本不匹配。
编辑2(可能更有用):
尝试使用旧版本的Tensorflow转换模型,例如使用以下命令:

import tensorflow as tf
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("model.h5")
converter.optimizations = []
converter.allow_custom_ops=False
converter.experimental_new_converter = True

tflite_model = converter.convert()

我通过以下更改对其进行了修复:

我这样保存了我的模型(tf gpu 2.2.0)或通过回调(.pb):

在build.gradle中,我添加了:

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
我通过运行以下命令将tensorflow版本(仅适用于转换器)更新为tf nightly(2.5.0):

pip3 install tf-nightly
并使用此代码(感谢Alex K.):


就是这样。

我通过以下更改修复了它:

我这样保存了我的模型(tf gpu 2.2.0)或通过回调(.pb):

在build.gradle中,我添加了:

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
我通过运行以下命令将tensorflow版本(仅适用于转换器)更新为tf nightly(2.5.0):

pip3 install tf-nightly
并使用此代码(感谢Alex K.):


就这样。

查看培训时使用的Tensorflow版本,在android build.gridle(应用程序)中使用相同的版本。
我在培训时使用tensorflow 2.4.0(最新版本),因此我在我的android build.gridle(应用程序)

查看培训时使用的tensorflow版本,在android build.gridle(应用程序)中使用相同的版本。
我在培训时使用了tensorflow 2.4.0(最新版本),所以我在我的android版本中加入了(实现'org.tensorflow:tensorflow lite:2.4.0')。gridle(应用程序)

没有修复它:/Sry仍然没有修复:/I修复了这个模型的问题(不知道如何修复),并想部署一个新的(定制MobileNet)…你帮我找到了解决方案。感谢Bro没有修复:/Sry仍然没有修复:/I修复了此模型的问题(不知道如何解决),并希望部署一个新的(自定义MobileNet)…您帮助我找到了解决方案。谢谢兄弟