获得完全量化的 TfLite 模型,也有 int8 上的输入和输出

Get fully qunatized TfLite model, also with in- and output on int8

我使用 Tensorflow 1.15.3 量化 Keras h5 模型(TF 1.13;keras_vggface 模型),以便将其与 NPU 一起使用。我用来转换的代码是:

converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + modelname)  
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

我得到的量化模型第一眼看起来不错。 输入层类型为int8,filter为int8,bias为int32,输出为int8.

但是,该模型在输入层之后有一个量化层,并且输入层是 float32 [见下图]。但似乎NPU也需要输入是int8。

有没有办法在没有转换层的情况下完全量化,但也有 int8 作为输入?

正如你在上面看到的,我使用了 :

 converter.inference_input_type = tf.int8
 converter.inference_output_type = tf.int8

编辑

来自用户 dtlam 的解决方案

即使模型仍然没有 运行 使用 google NNAPI,使用 TF 1.15.3 或 TF2.2.0 使用 in 和 int8 输出量化模型的解决方案是,感谢 delan:

...
converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + modelname) 
        
def representative_dataset_gen():
  for _ in range(10):
    pfad='pathtoimage/000001.jpg'
    img=cv2.imread(pfad)
    img = np.expand_dims(img,0).astype(np.float32) 
    # Get sample input data as a numpy array in a method of your choosing.
    yield [img]
    
converter.representative_dataset = representative_dataset_gen

converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.experimental_new_converter = True

converter.target_spec.supported_types = [tf.int8]
converter.inference_input_type = tf.int8 
converter.inference_output_type = tf.int8 
quantized_tflite_model = converter.convert()
if tf.__version__.startswith('1.'):
    open("test153.tflite", "wb").write(quantized_tflite_model)
if tf.__version__.startswith('2.'):
    with open("test220.tflite", 'wb') as f:
        f.write(quantized_tflite_model)

如果您应用 Post-training 量化,您必须确保您的代表性数据集不在 float32 中。此外,如果您确实想使用 int8 或 uint8 input/ouput 量化模型,您应该考虑使用量化感知训练。这也给你更好的量化结果

我也尝试从你给我的图像和代码中量化你的模型,毕竟它是量化的