当前位置:   article > 正文

深度学习 10 tf2模型转tflite,并进行权重量化_tf模型转tflite模型

tf模型转tflite模型

在tf2官方给出的量化方式有两种,训练后量化和感知量化。训练后量化是指模型训练好之后在进行 权重量化;感知量化是指在训练过程中自动根据训练数据的反馈进行量化。感知量化对模型的精度影响最小。

1 训练后量化

  1. # -*- coding: utf-8 -*-
  2. import tensorflow as tf
  3. import numpy as np
  4. import glob,os,cv2
  5. # 生成代表性数据集
  6. def get_representative_dataset():
  7. img_dir = r"数据"
  8. img_ext = ".bmp"
  9. img_paths = glob.glob(os.path.join(img_dir, '*' + img_ext))
  10. for path in img_paths:
  11. img=cv2.imdecode(np.fromfile(path,dtype=np.uint8),0)
  12. img= cv2.resize(img, (512,512), interpolation = cv2.INTER_NEAREST)/255
  13. img=img.reshape((1,512,512,1)).astype(np.float32)
  14. yield img,img
  15. #如果使用官方文档提供的下面的converter获取方法,会发现,最后转成出来的lite模型的输入依然为float类型。
  16. converter = tf.lite.TFLiteConverter.from_saved_model('saved_model')
  17. converter.optimizations = [tf.lite.Optimize.DEFAULT]
  18. tflite_quant_model = converter.convert()
  19. open("float_model.tflite", "wb").write(tflite_quant_model)
  20. #----------------加载并获取基本信息---------------------
  21. interpreter = tf.lite.Interpreter(model_path='float_model.tflite')
  22. #interpreter = tf.lite.Interpreter(model_content=concrete_func_tflite)
  23. interpreter.allocate_tensors()#给所有的tensor分配内存
  24. #获取 input 和 output tensor
  25. input_details = interpreter.get_input_details()
  26. output_details = interpreter.get_output_details()
  27. #输出字典,我们需要利用里面的输出来设置输入输出的相关参数
  28. print(input_details)
  29. print(output_details)
  30. #----------------进行预测---------------------
  31. input_shape = input_details[0]['shape']#设置输入维度
  32. data_gen=get_representative_dataset()
  33. x,x=data_gen.__next__()
  34. input_data = tf.constant(x)
  35. interpreter.set_tensor(input_details[0]['index'],input_data)
  36. #执行预测
  37. interpreter.invoke()
  38. output_results = interpreter.get_tensor(output_details[0]['index'])
  39. print(output_results.shape)#十个标签概率值的概率分布
  40. import matplotlib.pyplot as plt
  41. plt.imshow(output_results[0,:,:,0])
  42. plt.show()
  43. plt.imshow(x[0,:,:,0])
  44. plt.show()

2 训练前量化

tf中有一些layer不支持量化,因此需要进行规避(不对该层量化)

可以根据类型进行规避,也可以根据layer的name进行规避

  1. from keras import layers
  2. from keras.models import load_model
  3. import tensorflow as tf
  4. model=load_model('model_name.h5')
  5. import tensorflow_model_optimization as tfmot
  6. from tensorflow.keras import layers
  7. import tensorflow as tf
  8. # Helper function uses `quantize_annotate_layer` to annotate that only the
  9. # Dense layers should be quantized.
  10. def apply_quantization_to_dense(layer):
  11. if isinstance(layer, tf.keras.layers.Conv2DTranspose):#根据类型进行规避
  12. return layer
  13. elif isinstance(layer, tf.keras.layers.BatchNormalization):
  14. return layer
  15. elif isinstance(layer, tf.keras.layers.Concatenate):
  16. return layer
  17. elif isinstance(layer, tf.keras.layers.Activation):
  18. return layer
  19. elif layer.name=='img_out':#根据name进行规避
  20. return layer
  21. return tfmot.quantization.keras.quantize_annotate_layer(layer)
  22. annotated_model = tf.keras.models.clone_model(
  23. model,
  24. clone_function=apply_quantization_to_dense,
  25. )
  26. #已经被量化的模型
  27. model = tfmot.quantization.keras.quantize_apply(annotated_model)
  28. model.summary()
  29. #后续即可正常训练使用

更多权重量化方式请参考  
https://tensorflow.google.cn/lite/performance/post_training_quantization

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/154271
推荐阅读
相关标签
  

闽ICP备14008679号