发新帖

tensorflowLite的量化使用问题

[复制链接]
15530 86
薛俊锋  TF荚荚  发表于 2019-4-30 15:52:43 | 显示全部楼层
大神,你好,请问一下tensorflow能做16位量化吗?我把create_training_graph(quant_delay=0)修改成experimental_create_training_graph(input_graph=None,
                                       weight_bits=16,
                                       activation_bits=16,
                                       quant_delay=2000000,
                                       freeze_bn_delay=None,
                                       scope=None),按照样例步骤,我能得到16位的my_frozen_graph.pb,但是最后一部转化的时候bazel-bin/tensorflow/contrib/lite/toco/toco \
--input_file=my_frozen_graph.pb \
--output_file=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这个时候的参数--inference_type=QUANTIZED_UINT8不支持16位,相当于我做了16位的伪量化,但是最后转换成8位的,精度估计会有问题,这不算是16位量化吧
本楼点评(1) 收起
  • sunyanli您好,我前一段时间也在做这个,也是这样改的,我个人感觉这个是不对的。用toco转变的时候,好像只支持float和int8,要是量化成16bit,toco这个工具源码估计也得改。
    我是这么想的。这个量化方法不是google发的那篇论文有详细论述吗,里面不是有个量化公式:q=r/s  z 吗,我们要改成其他bit的量化,首先得改量化间隔,如果代码是根据这个量化方案写的,这个代码里面这一部分,改到n不就可以啦?可是目前我还没有找到。你有其他想法吗?
    2019-5-9 22:46 回复
小祥  TF荚荚  发表于 2019-6-13 11:19:26 | 显示全部楼层
你好。我最近在尝试量化 open pose这个项目, 已经成功得到了quantized aware training的模型,并且用 evaluation graph得到了 pb 文件,之后用 freeze_graph.freeze_graph得到了frozen pb,这些步骤都成功了,但是之后将pb 转为 tflite的模型过程中一直报错 ,错误都是类似的:

Unimplemented: this graph contains an operator of type Cast for which the quantized form is not yet implemented.

我尝试修改bug。 第一次报错是 contains an operator FusedBatchNormV3 which the quantized form is not yet implemented, 我在tensorflow12.0 环境下freeze 模型,得到的便是FusedBatchNorm 而不是FusedBatchNormV3 了(之前用的是tensorflow14.0rc版本)
第二次报错是 contains an operator Size which the quantized form is not yet implemented. 我将eval 模型中的 batchsize固定为1,  该错误消失
第三次报错是contains an operator Cast which the quantized form is not yet implemented, 具体的位置如下图所示:

这个错误找了好久都没法解决。不知道成果转换之后的模型 fuse batchnorm这块都是什么样的呢。我现在没法确定是伪量化训练过程中的问题,还是说是eval中的问题。求大神指导。

多谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
本楼点评(0) 收起
happy_national  TF荚荚  发表于 2019-7-10 09:42:16 | 显示全部楼层
@Zongjun  
大神您好,请教一下,我目前针对自己的tensorflow模型已经freeze成pb文件并通过toco命令行转换为tflite文件了,现在使用的是Post Training Quantization方式,使用Netron查看生成的tflite模型文件也好像没问题,但是我想在PC端运行测试下该模型的效果,却总是报错:
[{'name': 'Placeholder', 'index': 10, 'shape': array([ 1, 288, 800, 3], dtype=int32), 'dtype': <class>, 'quantization': (0.0, 0)}] self.interpreter.allocate_tensors() File "/home/anaconda3/envs/tensorflow13_gpuenv/lib/python3.7/site-packages/tensorflow/lite/python/interpreter.py", line 73, in allocate_tensors return self._interpreter.AllocateTensors() File "/home/anaconda3/envs/tensorflow13_gpuenv/lib/python3.7/site-packages/tensorflow/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py", tensorflow/lite/kernels/concatenation.cc:57 t0->dims->size &lt;= 4 was not true.Node number 259 (CONCATENATION) failed to prepare. 希望您看到后有空帮忙解答一下,不胜感激!(目前就想看下直接采用Post Training Quantization的压缩模型前向测试效果咋样,环境是tensorflow-gpu1.13,也正准备安装tf-nightly)

本楼点评(0) 收起
zjq-crystal  TF荚荚  发表于 2019-8-13 16:06:14 | 显示全部楼层
大家使用量化都是在移动端吗?没有在服务器端的么?有使用过Intel 的量化工具的么?
本楼点评(0) 收起
yucheng  TF荚荚  发表于 2019-9-9 18:19:58 | 显示全部楼层
首先先感谢此版各大神,在进行量化训练时能透过此篇文章慢慢摸索出来。
由于我是针对量化后的CNN设计硬体,所以需要将tflite的运算输出打印出来,与硬体的运算结果进行比较,但在进行完一整个layer的运算后,requantize的过程中,输出与scale相乘再返回uint8,总会有几笔输出会产生进位问题(该进位没进位),而我参考的运算是tensorflow/tensorflow/lite/kernels/internal/common.h中的MultiplyByQuantizedMultiplier ,所用到的SaturatingRoundingDoublingHighMul和RoundingDivideByPOT的函式也能在gemmlowp/fixedpoint/fixedpoint.h找到

像是这个实例 x=16809 ,M=0.0008031099569052458
照里面的算法会先将 M变成介于 [1-0.5)的值(M0) 所以M0等于0.8223845958709717, shift -10 在进行相乘后的结果为==>0000000000000000000110101111111110111011001110001101011000000000
接着进行SaturatingRoundingDoublingHighMul运算
由于31bit为0,就算有nudge1<<30也不会进位
==> 000000000000000000011010111111111
最后进行RoundingDivideByPOT,根据其运算,在这边也不会进位
最后得到1101也就是13 但tflite的结果却是14
这边想请问大神,是我在设计上有疏忽了啥运算吗?还是有哪边的运算搞错了?
本楼点评(1) 收起
  • yucheng我找到问题的源头了我直接用浮点数的形式将input,kernel,output的scale相乘,再截乘int32的形式,不过在tflite的运算里,似乎是先各别转成int32再相乘,然后再截成int32的M值
    2019-9-10 14:58 回复
热心市民刘先生  TF荚荚  发表于 2019-10-25 10:26:11 | 显示全部楼层
大神我想问一下,我生成的pb文件的大小大约是原来ckpt文件的三分之一左右。pb文件是将ckpt文件的权重固化到计算图上,这一步应该还是float32类型吧,按道理pb文件的大小应该和ckpt文件差不多大才是啊。
本楼点评(0) 收起
小坏坏  TF荚荚  发表于 2019-11-22 16:19:15 | 显示全部楼层
nick_nie 发表于 2019-4-10 01:21
之前看到论坛里有好多对基于slim框架的模型量化成功了,我最近基于deeplabv3+的模型进行量化遇到了一个问题 ...

这个问题我解决了,主要是slim.conv2d中有两个参数,rate 和 stride ,这两个的设置,要么是rate=1 stride=other 要么stride=1 rate=other ,我使用的是第一种,第二种应该也可行,但是我没有试过。大致的写法如下:
            with slim.arg_scope([slim.conv2d],
                normalizer_fn=slim.batch_norm,
                weights_initializer=tf.truncated_normal_initializer(stddev=0.01),
                biases_initializer=tf.constant_initializer(0.01)):
                with slim.arg_scope([slim.batch_norm],center=True,
                    scale=True,
                    is_training=is_training):
                    x = slim.conv2d(x, num_outputs=channels,kernel_size=[kernel,kernel],stride=stride)

本楼点评(1) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表