作者jack155861 (萧)
看板DataScience
标题[问题] tflite quantize
时间Wed Apr 6 08:29:44 2022
各位大大
试着把h5的档案转为 int8 的 tflite
我想厘清转换後权重与scale与zero point的关系,但遇到了一些问题,我的模型很简单
,如下
tf.keras.layers.Conv2D(16, (5,5), input_shape=(width,height, 1), activati
on='relu', padding='same')
tf.keras.layers.GlobalAveragePooling2D()
tf.keras.layers.Dense(3, activation='softmax')
我用以下代码试着inference一张图片
interpreter = tf.lite.Interpreter(model_path="test.tflite")
interpreter.allocate_tensors()
input_index = interpreter.get_input_details()[0]["index"]
output_index = interpreter.get_output_details()[0]["index"]
input_scale, input_zero_point = interpreter.get_input_details()[0]['quantizati
on']
image_ = image_input / input_scale + input_zero_point
interpreter.set_tensor(input_index, image_.astype(np.int8))
interpreter.invoke()
interpreter.tensor(output_index)()
得到结果array([[-123, 77, -82]], dtype=int8),这应该是符合预期的分类结果
我想试着看 tflite 每一层中的关系,想先从GlobalAveragePooling2D着手
经过conv2後得到一个80*80*16的矩阵以及经过GAV计算後得到一个1*16的矩阵,如下
https://i.imgur.com/Zq9OZST.jpg
依我对权重与scale与zero point的理解,我的计算如下
https://i.imgur.com/JyBw6nv.jpg
但结果似乎跟tflite真正计算的结果有很大的差异
这是我自己计算的结果
array([[ 63, 12, 8, 31, 67, 32, 16, 16, 34, 2, 51, -15, 66,
43, 64, 5]], dtype=int8)
这是tflite计算的结果
array([[-123, 77, -82, 32, 67, 32, 17, 16, 35, 2, 52,
-15, 67, 44, 65, 5]], dtype=int8)
不知道是不是我哪里忽略算错了呢 感谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.161.29.180 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1649204986.A.2AF.html
1F:→ chang1248w: 为啥不全丢截图... 04/09 19:08
2F:→ jack155861: 抱歉 因为最重点的就是 这两张截图的计算啦 04/09 21:08
3F:→ chang1248w: 前三个数字发生什麽事我没有头绪,後面几个的差异是 04/11 20:08
4F:→ chang1248w: 因为你直接把tensor 压进int里 04/11 20:08
5F:→ chang1248w: 印象中不管是tf还是np都是做无条件舍去 04/11 20:08
6F:→ chang1248w: 中间补个round吧 04/11 20:09