1,概述
模型量化应该是现在最容易实现的模型压缩技术,而且也基本上是在移动端部署的模型的毕竟之路。模型量化基本可以分为两种:post training quantizated和quantization aware training。在pyrotch和tensroflow中都提供了相应的实现接口。
对于量化用现在常见的min-max方式可以用公式概括为:
$r = S (q - Z)$
上面式子中q为量化后的值,r为原始浮点值,S为浮点类型的缩放系数,Z为和q相同类型的表示r中0点的值。根据:
$\frac{q - q_{min}}{q_{max} - q_{min}} = \frac{r - r_{min}}{r_{max} - r_{min}}$
可以推断得到S和Z的值:
$S = \frac{r_{max} - r_{min}}{q_{max} - q_{min}}$
$Z = q_{min} - \frac{r_{min}}{S}$
2,实验部分
post training quantizated
在tensorflow中实现起来特别简单,训练后的模型可是选择用savedModel保存的模型作为输入进行量化并转换成tflite,我们将这个版本称为v1版本。
importtensorflow as tf
saved_model_dir= "./pb_model"converter=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir,
input_arrays=["inputs"],
input_shapes={"inputs": [1, 784]},
output_arrays=["predictions"])
converter.optimizations= ["DEFAULT"]
tflite_model=converter.convert()
open("tflite_model_v3/eval_graph.tflite", "wb").write(tflite_model)
但在实际过程中这份代码转换后的tflite模型大小并没有缩小到1/4。所以非常奇怪,目前还不确定原因。在这基础上我们引入了一行代码,将这个版本称为v2:
importtensorflow as tf
saved_model_dir= "./pb_model"converter=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir,
input_arrays=["inputs"],
input_shapes&