如何优化和压缩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网络变得更瘦。
神经网络的裁剪,目前也是学术的一个热门研究方向,但是并不是每一个网络结构都有裁剪的空间,通常来说,应该结合实际的需要,使用合适的技术手段,选择一个合适大小的模型文件。