Tensorflow量化步骤及生成量化的tflite(2)

第二部分:Tensorflow伪量化训练操作(生成量化的tflite)

序:

(2018.12.24更新:鉴于评论中有人误解,我这里写清楚一点,后来者也可以先去看看评论区的问题然后再决定要不要看这篇博客~
我当初在添加伪量化代码执行完全量化训练这部分,只找到一篇有用的文章,所以决定给我这样的迷茫小白在这一部分添加一份“小白启发指南”(希望有用)。
这是第一次写博客,我会从评论中不断改进滴~)
1.普通量化步骤及使用详见“第一部分”:
2019年2月21日更新:https://blog.csdn.net/angela_12/article/details/84999473
2.伪量化训练,新出现的博客:
[min,max]的部分可以看看:TensorFlow量化训练
3.伪量化含义理解:
伪量化是完全量化的第一步,它只是模拟了量化的过程,并没有实现量化,只是在训练过程中添加了伪量化节点(也就是后面要说的两句话,创建训练图推理图分别添加进去),计算过程还是用float32计算。
然后训练得出.pb文件,放到toco指令里去实现第二步完整的量化,最后生成tflite,实现int8计算。

我的环境:

2018.12.24更新:
1.系统:Ubuntu16.04
2. Python版本:3.5.2
3. TensorFlow Lite(tflite)版本:Release 0.1.7
4. TF版本: 源码安装时版本为1.9.0,后来用pip升级为1.11.0。TF版本查看方法:
命令行输入python ,进入Python环境,输入:

import tensorflow as tf
tf.__version__  

前面先说一点概述性的东西,也简单记录下我做这个的心路历程,想直接看干货的就翻到下面去吧。
做了几个月,主要是找不到人问,自己基础差又解决不了 ,很是浪费时间,这个方面的网上的博客千篇一律,写的能用的简直太少了(可能大神们都没时间写基础的东西吧…),现在终于有点成效,所以就想好好整理一下这个实现的过程,给像我一样的小白们一点启发吧……

正文:

量化训练不用工具都是手写代码来实现各种功能的话,感觉不用源码安装用pip来安装就好了(参见量化安装,还没写完,这部分别人写了很多,我也是照着他们的做的,先把链接给在这吧),然后主要是写代码来加入量化节点,也就是官方给出的两个关键语句
create_training_graphcreate_eval_graph
这两句话放到一起,也就是放在一个.py文件里面写我没弄出来,感觉也不适合放在一起。所以,为了逻辑清晰,也为了减少麻烦(吾等小白只能乖乖按照官方的例子来,试过各种写法全部失败……),还是建议分开写,像官方的两个例子那样:
分为3个.py文件:模型定义(所用网络的定义)、train .py(加入create_training_graph) 和 eval .py (或freeze .py:加入create_eval_graph )。

两个例子分别是:slim写的mobilenet_v1_train.py、mobilenet_v1_eval.py和mobilenet_v1.py,位置的话在这里
这个例子我最开始看的,里面的格式跟官网给出的“定点量化”文章很像,但是total_loss这里我总出问题,还有learning_rate配着GradientDescentOptimizer用也有问题,然后找不到答案,就跑去社区看问题,发现了后面给的链接中Zongjun大神的回复,然后就问了我的问题,没想到遇到一个又耐心又会讲解的大神,真是这几个月以来最幸福的时刻,再次感谢大神~
有兴趣的可以去看看那个问题,在参考1.这里,基本上就是我做出这个伪量化的整个过程了,里面遇到的问题也基本都有问到(貌似用了将近20天的时间,好慢……)。

#############好啦,现在就直接写过程吧##############

上面那个例子没有speech_commands简单清晰,所以主要看这个例子就好了。
参考的代码是:models.pytrain.pyfreeze.py

我的主要目的是生成量化的tflite,用8bit来计算,之后可以用在手机端来测试性能啥的,所以看了官方文档之后发现,这个只有一种方法就是:quantization-aware training

  1. 在训练图中加入create_training_graph作为fake quantization nodes,然后训练,生成ckpt和pbtxt文件(参考train.py)。
  2. 创建推理图(freeze.py里的create_inference_graph()),就是重新调用训练时用的网络模型(例子里就是models.py 的create_model),然后给出一个输出,也就是logits = models.create_model()和tf.nn.softmax(logits, name=‘labels_softmax’)这两句话,前面的都是数据处理,没什么用。
  3. 将上面的输出(训练好的数据)传给create_eval_graph(),就是models.load_variables_from_checkpoint(),这里的eval把这张推理图数据转换成tflite能够识别并量化的格式。
  4. 后面的frozen_graph_def把ckpt和pbtxt固化,freeze 成.pb文件,这个图中就是带有fake quantization nodes的了。可以用tensorboard或者Netron来查看图。
  5. 上面的就完成了官方文档说的第一步,然后将上面生成的pb文件放到toco工具中,运行就可以生成tflite了。
toco工具的安装也是用bazel,编译并执行是下面的指令:

2019.3.6更新: 这里的文件夹换了,改成:tensorflow/lite/toco,注意替换一下!!

bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \
--input_file=/home/.../tensorflow/.../Mnist_train/speech_my_frozen_graph.pb \
--output_file=/home/.../tensorflow/.../Mnist_train/speech_my_frozen_graph.tflite \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--inference_type=QUANTIZED_UINT8 \
--input_shapes=1,98,40,1 \
--input_arrays=Reshape_1 \
--output_arrays=labels_softmax \
--allow_custom_ops
仅执行:
bazel-bin/tensorflow/contrib/lite/toco/toco \
--input_file=/home/.../tensorflow/.../Mnist_train/speech_my_frozen_graph.pb \
--output_file=/home/.../tensorflow/.../Mnist_train/speech_my_frozen_graph.tflite \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--inference_type=QUANTIZED_UINT8 \
--input_shapes=1,98,40,1 \
--input_arrays=Reshape_1 \
--output_arrays=labels_softmax \
--allow_custom_ops
注:

1)tflite文件不只是用在移动端的,PC端也是可以的,感觉是因为移动端主要用的是tflite,然后PC端也可以用Python脚本来使用tflite(用的是tf.contrib.lite.Interpreter),所以谷歌就都换成tflite了,之前的quantize_graph.py被谷歌删除了,这个工具感觉可以不用了。现在唯一的保证精度的方法就是伪量化训练生成pb,然后toco转化为tflite,toco转化也可以用Python来写,这部分,我之后来补上。
(这一部分,建议参考社区问题Zongjun大神的第一个回答:https://www.tensorflowers.cn/t/7136)
2)将上面input_file(这里的pb文件路径是最后freeze生成的pb路径)和output_file(这里的tflite路径是要生成的tflite要保存的路径)的路径换成自己的路径,写绝对路径比较好。
3)allow_custom_ops:这个指令可以避免一些不必要的错误,允许一些传统方法,相关知识可以去下面的参考博客中去看。
4)–input_shapes它后面那几个要注意末尾的“s”,要么都加,要么都不加。这几个的获取可以用:

sudo bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
--in_graph=/home/.../tensorflow/Mnist_train/speech_my_frozen_graph.pb

来查看简要信息(summarize_graph这个也是要bazel来编译的)
不过这里面针对这个例子打印出来的 input_arrays是wav_data,看图也是这个,但是用这个的话会报错,实际上是 Reshape_1,这个是大神试出来的,打印完整结构的话,能看到这个输入,就是在 summarize_graph指令的后面加一句:–print_structure=true。

sudo bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
--in_graph=/home/.../tensorflow/Mnist_train/speech_my_frozen_graph.pb \
--print_structure=true

5)至于有人提到的–default_ranges_min=0 --default_ranges_max=6这两个指令,我觉得它是Post Training Quantization 需要的,这个方法可以不训练直接转化,但是精度不如训练的,应该是差很多,而且还是用float32计算的(这里可能有点问题,需要再想想)。
6)quantization-aware training文章里提到的–std_value=127.5 --mean_value=127.5这两个指令我没用,还没确定这两个怎么用,知道了再来更新。

运行speech例子:

2018.12.18更新: 今天tensorflow的官方公众号发布了一篇讲解speech这个例子的文章,感觉挺有用的,只是除了里面的量化没有讲…不过作为了解TF框架的例子来讲还是挺好的,位置在这里。)

  1. train .py:没有数据的话,它会自动下载数据包,有2.4G,有语音数据的话,可以自己看看数据格式然后用自己的数据训练。具体可以看train.py上面的注释。要想得到量化的结果记得–quantize这里改成True。
  2. freeze.py里面—output_file这里写上自己想要存储的路径。–start_checkpoint这里写上要使用的ckpt文件,格式是:default=’/tmp/speech_commands_train/conv.ckpt-110’。
  3. 在Netron中查看的图是这样的:.pb   在这里插入图片描述speech.pb
    在这里插入图片描述 speech.tflite

上面是官方的例子,下面写一下我自己的练习,对于这些新技术,我都是在mnist里面实现的,之前测试量化工具和学习tensorflow训练也是用这个,都说它是tensorflow的“hello world”嘛。
(2018.12.21补充:speech.pb大小为3.7M,speech.tflite大小为929.5K)

mnist伪量化训练练习代码:

也分为三部分:

(代码可参考我的github:mnist_fakequantization工程代码
1.mnist_build_network.py,代码如下:

代码解析参考博客:https://blog.csdn.net/real_myth/article/details/51782207

import tensorflow as tf
# 创建图片占位符:x,标签占位符:y 和 随机失活系数keep_prob,以供处理图片,训练和预测时使用
#[x并不是一个特定的值,它是一个placeholder,一个我们需要输入数值当我们需要tensorflow进行运算时。我们想要输入任意数量的mnist图片,每一个都展开成一个784维的向量。我们用一个二维的[None, 784]浮点张量代表。 (这里的None表示维度可以是任意的长度.)]
x = tf.placeholder("float", shape=[None, 784], name='input')
y = tf.placeholder("float"
  • 21
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 88
    评论
以下是tflite文件量化步骤和示例代码: 1.首先,您需要准备一个TensorFlow模型并将其转换为tflite格式。您可以使用TensorFlow Lite Converter API或命令行工具tflite_convert来完此操作。 2.接下来,您需要选择一种量化方法。TensorFlow Lite支持两种量化方法:动态范围量化和全精度量化。动态范围量化使用8位整数表示权重和激活值,而全精度量化使用32位浮点数表示它们。动态范围量化通常会导致模型大小的显著减小,并且可以在保持准确性的同时提高推理速度。 3.根据您选择的量化方法,您需要选择适当的转换器选项。例如,如果您选择动态范围量化,则需要指定代表权重和激活值的最小和最大值的数据集。如果您选择全精度量化,则需要指定代表权重和激活值的比例和偏移量。 4.最后,您可以使用TensorFlow Lite Interpreter API或命令行工具tflite_convert来加载和运行量化tflite模型。 以下是一个动态范围量化的示例代码: ```python import tensorflow as tf # Load the original TensorFlow model model = tf.keras.models.load_model('my_model.h5') # Convert the model to TFLite format converter = tf.lite.TFLiteConverter.from_keras_model(model) tflite_model = converter.convert() # Define the representative dataset for dynamic range quantization def representative_dataset(): for x, _ in test_dataset: yield [x] # Define the TFLite converter options for dynamic range quantization converter = tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_dataset converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type = tf.uint8 converter.inference_output_type = tf.uint8 # Convert the model to dynamically quantized TFLite format tflite_quant_model = converter.convert() # Save the quantized TFLite model to disk with open('my_model_quant.tflite', 'wb') as f: f.write(tflite_quant_model) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 88
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值