tensorflow模型优化--量化

量化的概念:
量化(quantitative),这里不是指金融上的量化交易,而是指离散化。量化是一个总括术语,是用比 32 位浮点数更少的空间来存储和运行模型,并且 TensorFlow 量化的实现屏蔽了存储和运行细节。

神经网络训练时要求速度和准确率,训练通常在 GPU 上进行,所以使用浮点数影响不大。但是在预测阶段,使用浮点数会影响速度。量化可以在加快速度的同时,保持较高的精度。

量化网络的动机主要有两个。最初的动机是减小模型文件的大小。模型文件往往占据很大的磁盘空间,有时,每个模型都接近 200 MB,模型中存储的是分布在大量层中的权值。在存储模型的时候用 8 位整数,模型大小可以缩小为原来 32 位的 25%左右。在加载模型后运算时转换回 32 位浮点数,这样已有的浮点计算代码无需改动即可正常运行。

量化的另一个动机是降低预测过程需要的计算资源。这在嵌入式和移动端非常有意义,能够更快地运行模型,功耗更低。从体系架构的角度来说,8 位的访问次数要比 32 位多,在读取 8 位整数时只需要 32 位浮点数的 1/4 的内存带宽,例如,在 32 位内存带宽的情况下,8 位整数可以一次访问 4 个,32 位浮点数只能 1 次访问 1 个。而且使用 SIMD 指令(19.2节会加速介绍该指令集),可以在一个时钟周期里实现更多的计算。另一方面,8 位对嵌入式设备的利用更充分,因为很多嵌入式芯片都是 8 位、16 位的,如单片机、数字信号处理器(DSP 芯片),8 位可以充分利用这些。

此外,神经网络对于噪声的健壮性很强,因为量化会带来精度损失(这种损失可以认为是一种噪声),并不会危害到整体结果的准确度。

那能否用低精度格式来直接训练呢?答案是,大多数情况下是不能的。因为在训练时,尽管前向传播能够顺利进行,但往往反向传播中需要计算梯度。例如,梯度是 0.2,使用浮点数可以很好地表示,而整数就不能很好地表示,这会导致梯度消失。因此需要使用高于 8 位的值来计算梯度。因此,正如在本节一开始介绍的那样,在移动端训练模型的思路往往是,在 PC 上正常训练好浮点数模型,然后直接将模型转换成 8 位,移动端是使用 8 位的模型来执行预测的过程。

1:下载解压tensorflow源码,并进入tensorflow目录。
2:编译量化脚本(一定要加sudo)

sudo bazel build tensorflow/tools/quantization:quantize_graph
3:开始量化.pb文件
sudo bazel-bin/tensorflow/tools/quantization/quantize_graph  --input=/tmp/PNet_output.pb --output_node_names="bbox_pred_out,cls_prob_out,landmark_pred_out" --output=/tmp/newpb/PNet_output.pb --mode=eightbit


原文:https://blog.csdn.net/liuzhengnan007/article/details/80434956 

你可能感兴趣的:(tensorflow)