Tensorflow Lite的量化工具tf.contrib.quantize的使用(缓慢更新)

本文介绍了如何使用Tensorflow Lite的量化工具tf.contrib.quantize进行模型量化。通过在MNIST数据集上应用简化版的Lenet网络,展示了量化过程中的步骤,包括创建训练和评估图、冻结图以及使用TOCO转换为.tflite模型。在实施过程中遇到的bug和解决方法也在文中进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019第一篇,先祝大家新年快乐鸭~
本文使用的是Tensorflow Lite中自带的量化工具包,Github上官方代码使用手册,我看到是18年12月才更新的工具包,import方式改变了,直接从tf.contrib.quantize中import,做的人还比较少,本文想先评估一下它的量化效果,也记录一下使用方法,因为其实官方没有给很多的demo指导。
TODO

  • 在模型中加入量化工具
  • 尝试在已训练好的模型加载量化
  • 继续测评

打开一个训练好的graph(测试)

因为我之前做keras比较多,所以其实这里上手还是磨合了一番的。
准备环境:
python3.5
tensorflow-gpu==1.12.0
加上一个已经训练好,freeze过的graph

直接上代码,我说也说不清,参考一下这个
这里有一个很纠结的点就是这样打开.pb文件就是GraphDef而不是tf.Graph()文件,如果直接用量化函数打开graph_def就会报错 AttributeError: ‘GraphDef’ object has no attribute 'get_all_collection_keys’

import tensorflow as tf
from tensorflow.contrib.quantize import *
with tf.Session() as sess:
    with gfile.FastGFile('./VGG16_freeze.pb', 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        tf.import_graph_def(graph_def, name='vgg')
    graph = sess.graph
    out = create_training_graph(graph, 100)

但是呢,这里如果只按照我这个代码来其实还是不行的,报错如下

INFO:tensorflow:Saver not created because there are no variables in the graph to restore
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/contrib/quantize/python/quantize.py", line 200, in QuantizeOpWithWeights
    input_idx = next(i for i, v in enumerate(op.inputs)
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/contrib/quantize/python/quantize_graph.py", line 112, in create_training_graph
    device_name_or_function=device_name_or_function)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/contrib/quantize/python/quantize_graph.py", line 68, in _create_graph
    quantize.Quantize(g, is_training=is_training)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/contrib/quantize/python/quantize.py", line 101, in Quantize
    context.QuantizeOpWithWeights(op, folded=False)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/contrib/quantize/python/quantize.py", line 204, in QuantizeOpWithWeights
    raise ValueError('No inputs to quantize for op: %s' % op)
ValueError: No inputs to quantize for op: name: "vgg/block1_conv1/convolution"

这里很明显就是说只加载图是不行的,还要定义一下输入的节点,所以整个的代码应该要加上一下对应的tf.placeholder()

说明:
这里tf版本之间区别比较大,我之前用的是1.6.0,函数的定义和最新版本的完全不一样,不过也可以做,1.6.0版本中没有quant_delay参数&

03-25
### 关于 `contrib` 的技术背景 在信息技术领域中,`contrib` 是一个常见的术语,通常表示“contribution”,即贡献模块或扩展功能集合。这些模块可能由社区开发者提供,用于补充核心库的功能。以下是几个具体的技术场景及其相关内容: #### TensorFlow 中的 `tf.contrib` `tf.contrib` 是 TensorFlow 提供的一个实验性模块,旨在支持尚未完全稳定的功能[^1]。此模块中的 API 可能会在未来版本中发生变化甚至被移除,因此不适合生产环境下的长期依赖。 下面是一个简单的代码示例展示如何使用 `tf.contrib.summary` 来记录摘要信息: ```python import tensorflow as tf global_step = tf.train.get_or_create_global_step() summary_writer = tf.contrib.summary.create_file_writer( "train_dir", flush_millis=10000) with summary_writer.as_default(), tf.contrib.summary.always_record_summaries(): loss_value = 0.5 # 假设这是模型计算得到的损失值 tf.contrib.summary.scalar("loss", loss_value) ``` 上述代码展示了如何启用 TensorBoard 日志记录器来跟踪训练过程中的标量指标。 #### Django 开发中的 `django.contrib` Django 框架提供了许多内置的应用程序作为其 contrib 子包的一部分[^2]。例如,`django.contrib.auth` 处理身份验证逻辑;而 `django.contrib.admin` 则实现了强大的管理界面。 为了增强 CSRF 攻击防护能力,在视图函数处理 POST 请求时应遵循以下原则: - **无副作用 GET 方法**:确保所有的 GET 路径仅限于读取操作而不修改服务器状态。 - **加入随机令牌到表单提交流程**:通过模板渲染向 HTML 表单注入隐藏字段,并校验返回的数据是否匹配预期值。 另外,自定义上下文处理器可以通过创建名为 `context_processors.py` 文件实现全局变量共享机制[^3]。 #### TensorFlow Lite量化工具 `tf.contrib.quantize` 对于移动端优化需求而言,TensorFlow Lite 成为一个重要分支项目[^4]。其中涉及到了一种降低存储空间占用率的方法叫做权重压缩或者说是数值精度缩减(quantization),这正是 `tf.contrib.quantize` 所负责的部分工作内容之一。 准备阶段需要安装特定版本 Python 解释器以及 GPU 版本 TF 库之后加载预训练好的冻结模型文件继续后续步骤。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值