对tflite模型进行量化的过程中遇到错误
错误代码:
keras_model = tf.keras.models.load_model('lenet_GPU.h5') converter = tf.lite.TFLiteConverter.from_keras_model(keras_model) tflite_model = converter.convert()
报错如下:
ConverterError: d:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\saved_model\save.py:1267:0: error: 'tf.Conv2D' op is neither a custom op nor a flex op :0: note: loc(fused["StatefulPartitionedCall:", "StatefulPartitionedCall"]): called from d:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\saved_model\save.py:1267:0: note: Error code: ERROR_NEEDS_FLEX_OPS :0: error: failed while converting: 'main': Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: https://www.tensorflow.org/lite/guide/ops_select TF Select ops: Conv2D Details: tf.Conv2D(tensor, tensor<3x3x1x8xf32>) -> (tensor) : {data_format = "NHWC", device = "", dilations = [1, 1, 1, 1], explicit_paddings = [], padding = "SAME", strides = [1, 1, 1, 1], use_cudnn_on_gpu = true}
ChatGPT:
这个错误是由于在将 TensorFlow 模型转换为 TensorFlow Lite(TFLite)模型时遇到了不支持的操作。具体来说,错误指出了 'tf.Conv2D' 操作不是自定义操作(custom op)也不是弹性操作(flex op),因此无法在 TFLite 运行时使用。
解决这个问题的一种方法是启用 TensorFlow 内核回退(TF kernels fallback),通过 TF Select 选择需要的操作。你可以按照链接 https://www.tensorflow.org/lite/guide/ops_select 中提供的说明来启用 TF Select。
精选 TensorFlow 算子:
由于 TensorFlow Lite 内置算子库仅支持有限数量的 TensorFlow 算子,所以并非所有模型都可以转换。
为了允许进行转换,用户可以在 TensorFlow Lite 模型中启用特定 TensorFlow 算子的使用。但是,运行带 TensorFlow 算子的 TensorFlow Lite 模型需要引入核心 TensorFlow 运行时,这会增加 TensorFlow Lite 解释器的二进制文件大小。
代码修正:
keras_model = tf.keras.models.load_model('lenet_GPU.h5') converter = tf.lite.TFLiteConverter.from_keras_model(keras_model) converter.target_spec.supported_ops = [ tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops. tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops. ] tflite_model = converter.convert()