[問題] tflite quantization

作者: jack155861 (蕭)   2022-04-04 15:09:10
各位大大好
試著把h5的檔案轉為 int8 的 tflite
我想試著釐清轉換後權重與scale與zero point的關係,但遇到了一些問題
我的模型很簡單,如下
tf.keras.layers.Conv2D(16, (5,5), input_shape=(width,height, 1),
activation='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]['quantization']
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)
不知道是不是我哪裡忽略算錯了呢
感謝!!
作者: lycantrope (阿寬)   2022-04-05 09:44:00
可以轉DataScience版,讓高手解答w

Links booklink

Contact Us: admin [ a t ] ucptt.com