上回記錄了mobilenet ssd v2模型的壓縮和轉(zhuǎn)換過程吱晒,還留了一個(gè)尾巴,那就是模型的量化联四。這應(yīng)該也是一個(gè)可以深入的問題撑碴,畢竟我在查閱資料的時(shí)候看到了什么量化、偽量化朝墩,whatever醉拓。具體的概念和原理不在此贅述(其實(shí)就是我也還沒研究過。。亿卤。)玫镐,本著工程實(shí)用優(yōu)先的原則,先記錄一下量化流程吧怠噪,畢竟業(yè)務(wù)部門只關(guān)心能不能上線以及何時(shí)上線
書接上文恐似,MobileNet SSD V2模型的壓縮與tflite格式的轉(zhuǎn)換 - 簡書,因?yàn)槭莟flite模型的量化傍念,所以上文的流程還是需要走一遍的矫夷,只是幾個(gè)地方需要調(diào)整一下。
修改配置文件
這次我們需要用到的就是圖中的最后一個(gè)文件憋槐,經(jīng)過對(duì)比双藕,量化模型的配置文件與非量化的區(qū)別就在于多了如下幾行:
graph_rewriter {
? quantization {
? ? delay: 48000
? ? weight_bits: 8
? ? activation_bits: 8
? }
}
所以如果你不想下載新的文件,在之前的配置文件末尾加上這一部分就可以了阳仔。
訓(xùn)練模型
和配置文件類似忧陪,加載預(yù)訓(xùn)練模型有對(duì)應(yīng)的量化版可以選擇,然后就和上文一樣訓(xùn)練近范,一樣導(dǎo)出嘶摊。
~~~~~~~~~~~~~~~~~~~~分割線~~~~~~~~~~~~~~~~~~~
到此為止,得到了訓(xùn)練產(chǎn)生的ckpt以及導(dǎo)出的pb文件评矩。
tflite量化
接下來進(jìn)入模型量化的核心部分叶堆,
第一步,將ckpt轉(zhuǎn)成pb文件斥杜,使用的是python?export_tflite_ssd_graph.py虱颗,會(huì)得到tflite_graph.pb和tflite_graph.pbtxt兩個(gè)文件,這里與之前是相同的蔗喂;
第二步忘渔,將pb轉(zhuǎn)為tflite文件,依舊是進(jìn)入到tensorflow/contrib/lite/python目錄缰儿,運(yùn)行python tflite_convert.py畦粮,然而這一次,除了上次設(shè)置的參數(shù):
--graph_def_file=XXX/tflite_graph.pb 上一步生成的pb文件地址
--output_file=XXX/xxx.tflite 輸出的tflite文件地址
--input_arrays=normalized_input_image_tensor 輸入輸出的數(shù)組名稱對(duì)于mobilenet ssd是固定的返弹,不用改?
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'
?--input_shape=1,XXX,XXX,3 輸入的圖片大小锈玉,需要與配置文件中一致
--allow_custom_ops
還有幾個(gè)參數(shù)需要注意一下:
--inference_type=QUANTIZED_UINT8 默認(rèn)是FLOAT,量化時(shí)需要改為QUANTIZED_UINT8
--mean_values=128?
--std_dev_values=128
對(duì)于均值和標(biāo)準(zhǔn)差的設(shè)置义起,我找到了一個(gè)來自stackoverflow的計(jì)算方法:
mean_value = the uint8 value in the range [0, 255] that corresponds to floating point 0.0. So if the float range is [0.0, 1.0], then mean_value = 0.
std_value = (uint8_max - uint8_min) / (float_max - float_min). So if the float range is [0.0, 1.0], then std_value = 255 / 1.0 = 255.
(我試了0拉背,255和128,128這兩組默终,直觀感受128椅棺,128效果更好犁罩,網(wǎng)上也有人實(shí)測其他組合效果更加,因此大家還是自己去調(diào)參吧)
經(jīng)過這么一通操作两疚,最后生成的tflite模型僅400+K床估,精度損失肯定是有的,但我還沒有具體去測诱渤。
參考
https://blog.csdn.net/qq_26535271/article/details/84930868
Tensorflow Lite toco --mean_values --std_values? - Stack Overflow