tensorflow 量化和裁剪的资料

如何优化和压缩tensorflow模型

一 优化模型

移动设备有很大的局限性,因此可以进行任何可以减少应用程序占用空间的预处理值得考虑。

TensorFlow库的一种方式是保持较小的移动性,只支持在推理期间常用的操作子集。这是一个合理的方法,因为在移动平台上很少进行培训。同样,它也排除了对大型外部依赖关系的操作的支持。您可以在tensorflow / contrib / makefile / tf_op_files.txt文件中看到支持的操作列表。

默认情况下,大多数图表包含TensorFlow的移动版本不支持的培训操作。。TensorFlow不会加载包含不受支持操作的图(即使不支持的操作与推断无关)。

优化推理

为了避免由不受支持的培训操作引起的问题,TensorFlow安装包括一个工具optimize_for_inference,可删除给定的一组输入和输出不需要的所有节点。

该脚本还进行了一些其他优化,可以帮助加快模型,例如将显式批量归一化操作合并到卷积权重中以减少计算次数。这可以根据输入型号提供30%的速度。运行脚本的方法如下:

python -m tensorflow.python.tools.optimize_for_inference \

  --input = tf_files / retrained_graph.pb \

  --output = tf_files / optimized_graph.pb \

  --input_names =“input”\

  --output_names = “final_result”

运行此脚本将在此创建一个新文件tf_files/optimized_graph.pb。

验证优化模型

要检查optimize_for_inference 没有改变网络的输出,比较label_image输出retrained_graph.pb与的optimized_graph.pb:

python -m scripts.label_image \

  --graph = tf_files / retrained_graph.pb \

  --image = tf_files / flower_photos /菊花/ 3475870145_685a19116d.jpg

python -m scripts.label_image \

    --graph = tf_files / optimized_graph.pb \

    --image = tf_files / flower_photos /菊花/ 3475870145_685a19116d.jpg

当我运行这些命令时,我看到输出概率没有改变为5位小数。

现在运行它,以确认您看到类似的结果。

用TensorBoard调查变化

如果您遵循第一个教程,您应该有一个tf_files/training_summaries/目录(否则,只需通过发出以下Linux命令创建目录:)mkdir tf_files/training_summaries/。

以下两个命令会杀死任何运行的TensorBoard实例并启动一个新实例,在后台观察该目录:

pkill -f张量板

张量纸--logdir tf_files / training_summaries&

在后台运行的TensorBoard可能会偶尔向您的终端打印以下警告,您可以安全地忽略该警告

WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404.

现在将两个图形添加为TensorBoard日志:

python -m scripts.graph_pb2tb tf_files / training_summaries / retrained \

  tf_files / retrained_graph.pb

 

python -m scripts.graph_pb2tb tf_files / training_summaries / optimized \

  tf_files / optimized_graph.pb

现在打开TensorBoard,并导航到“图形”选项卡。然后从左侧标有“运行”的选择列表中选择“再培训”。

浏览图表,然后从“运行”菜单中选择“优化”。

从这里可以确认已经合并了一些节点来简化图表。您可以通过双击来扩展各个块。

二 http://blog.csdn.net/baidu_37967613/article/details/72678003

为什么量化是可能的?

由于神经元只抽取必要信息并给出响应,这样整个网络是抗噪和鲁棒的。训练完成后进行推断时,减低精度的定点化量化也可以考虑为噪声,因此不会产生大影响。

 

如何量化和量化意义?

网络参数是按层组织,每层数值都在同一数量级,即范围相差不大,如[-6.0,4.0],有大量论文研究表明确认值最大和最小后每层数据使用8bit定点化量化已可以很好满足推断计算。

量化最直接结果是参数存储空间要求变小,经验值是减少约3/4;减少内存读取数据量,节省带宽;使用simd进行计算加速,如果有dsp进行8bit加速计算节能,使得移动设备上进行推断计算变得更强大有效。

 

 

怎么量化模型?

需要使用tensorflow提供的量化工具,使用示例如下

[plain] view plain copy

bazel-bin/tensorflow/tools/quantization/quantize_graph \ 

  --input=/tmp/classify_image_graph_def.pb \ 

  --output_node_names="softmax" --output=/tmp/quantized_graph.pb \ 

  --mode=eightbit 

 

 

该工具需要下载tensorflow源码,安装bazel(可参见blog.csdn.net/u010510350/article/details/52247972),并进行配置和编译生成。

编译前请确认tensorflow源码下载后,已进行./configure, 这个过程会配置相关的依赖程序和库。为了使得依赖少一些,可以在configure时选择不打开一些选项。

bazel build tensorflow/tools/quantization:quantize_graph  #具体路径可能会随版本变化

生成的可执行文件在bazel-bin/tensorflow/tools/quantization/quantize_graph,此时即可进行量化转化了,--help可以打开使用帮助。

 

此时需要了解输出节点的名称,如上“softmax”,如果你是网络的原本的开发人员,这个不是问题。如果手头得到的就是一个pb文件。那么就需要自己分析文件了。这个下个文档再介绍。

 

http://blog.csdn.net/u011961856/article/details/76736103

#编译量化工具

sudo bazel build tensorflow/contrib/quantization/tools:quantize_graph

#运行后报错:

ERROR: no such package 'tensorflow/contrib/quantization/tools': BUILD file not found on package path.

#修改命令为:

sudo bazel build tensorflow/tools/quantization:quantize_graph

 

http://fjdu.github.io/machine/learning/2016/07/07/quantize-neural-networks-with-tensorflow.html

https://www.tensorflow.org/performance/quantization

http://cwiki.apachecn.org/pages/viewpage.action?pageId=10029447

http://blog.csdn.net/masa_fish/article/details/56049710?winzoom=1

https://zhuanlan.zhihu.com/p/27191354

https://zhuanlan.zhihu.com/p/27191354

裁剪tensorflow

Tensorflow是一个很庞大的框架,对于手机来说,它占用的体积是比较大的,所以需要尽量的缩减tensorflow库占用的体积。

第一种裁剪的方案:

其实在解决前面遇到的那个crash问题的时候,已经指明了一种裁剪的思路,既然mobile版的tensorflow本来就是pc版本的一个子集,那就意味着可以根据具体的需要,让这个子集变得更小,这也就是达到了裁剪的目的。具体来说,就是修改tensorflow源码中的tensorflow/tensorflow/conrib/makefile/tf_op_files.txt文件,只保留使用到了的模块,针对HED网络,原有的200多个模块裁剪到只有46个模块,裁剪过后的tf_op_files.txt文件如下:见链接中的图

需要强调的一点是,这种操作思路,是针对不同的神经网络结构有不同的裁剪方式,原则就是用到什么模块就保留什么模块。当然,因为有些模块之间还存隐含的依赖关系,所以裁剪的时候也是要反复多次才能成功的。

第二种裁剪方法

编译级别的strip操作,在连接的时候会自动的把没有调用的函数去除掉(集成开发环境里通常已经自动将这些参数设置成了最佳组合)

借助一些高级技巧和工具,对二进制文件进行瘦身。

裁剪效果的对比:

借助所有这些的裁剪手段,最终我们的ipa安装包的大小只增加了3M,如果不做手动裁剪这一步的话,那么ipa的增量,则是30M左右。

模型的裁剪

以HED模型为例

论文中的HED模型文件的大小为56M,对于手机来说也是比较大的,需要将HED网络进行裁剪。

HED网络是VGG 16 作为基础网络结果,而VGG又是一个得到广泛验证的基础网络结构,因此修改HED的整体结构肯定不是一个明智的选择。

现在的需求只是检测举行区域的边缘,而并不是检测通用场景下的广义的边缘,可以认为前者的复杂度比后者低,所以一种可行的思路。就是保留HED的整体结构,修改VGG每一组卷机层里面的卷积核心的数量,让HED网络变得更瘦。

 

神经网络的裁剪,目前也是学术的一个热门研究方向,但是并不是每一个网络结构都有裁剪的空间,通常来说,应该结合实际的需要,使用合适的技术手段,选择一个合适大小的模型文件。

 

 

 

 

 

 

posted on 2017-10-16 22:05  一万种树  阅读(10056)  评论(0编辑  收藏  举报

导航