量化訓練

tensorflow量化訓練:

  1. post-training quantization: 剪枝,稀疏編碼,對模型存儲體積進行壓縮
  2. quatization-aware training: forward F32==>int8 映射,backward F32梯度更新,保存模型int8,quantize/dequantize
  3. 還有一種訓練和推理都用int8
  4. 在訓練過程中引入精度帶來的誤差,然後整個網絡在訓練過程中進行修正

模型大小不僅是內存容量問題,也是內存帶寬問題
量化就是將神經網絡的浮點算法轉化爲定點

花哨的研究往往是過於棘手或前提假設過強,以至於幾乎無法引入工業界的軟件棧
Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference揭示了量化感知訓練的諸多細節
爲什麼量化是有效的(具有足夠好的預測準確度),尤其是將FP32轉換爲INT8時已經丟失了信息?直覺解釋是神經網絡被過度參數化,進而包含足夠的冗餘信息,裁剪這些冗餘信息不會導致明顯的準確度下降。相關證據表明對於給定的量化方法,FP32網絡和INT8網絡之間的準確度差距對於大型網絡來說較小,因爲大型網絡過度參數化的程度更高

可能有用的github上的一些東西:

  1. Graph Transform Tool(tensorflow)
  2. Converter command line examples(tensorflow)

Tensorflow官網的一些東西:

  1. TensorFlow Lite and TensorFlow operator compatibility

tensorflow量化訓練技巧:

  1. 在你定義好網路結構之後,加上下面這句話,即可量化訓練: tf.contrib.quantize.create_training_graph(input_graph=g, quant_delay=200)
  2. 論文中提到,爲了使量化訓練有更好的精度,推薦使用relu6,讓輸出限制在較小的範圍內
  3. tf.contrib.quantize.create_eval_graph()和tf.contrib.quantize.create_training_graph()不能同時出現在同一程序中,不然會出問題
  4. 基於已經訓好的網絡去做模擬量化實驗的,不基於預訓練模型訓不起來,可能還有坑要踩,而且在模擬量化訓練過程中bn層參數固定,融合bn參數也是用已經訓練好的移動均值和方差,而不是用每個batch的均值和方差
  5. 重寫後的 eval 圖與訓練圖並非平凡地等價,這是因爲量化操作會影響 batchnorm 這一步驟
  6. 對於卷積層之後帶batchnorm的網絡,因爲一般在實際使用階段,爲了優化速度,batchnorm的參數都會提前融合進卷積層的參數中,所以訓練模擬量化的過程也要按照這個流程.首先把batchnorm的參數與卷積層的參數融合,然後再對這個參數做量化
  7. 對於權值的量化分通道進行求縮放因子,然後對於激活值的量化整體求一個縮放因子,這樣的效果最好

理論文章:

  1. tensorflow的量化教程(2)(csdn)
  2. 卷積神經網絡訓練模擬量化實踐(oschina)
  3. 神經網絡量化簡介(黎明灰燼)

實踐文章:

  1. 用於coral TPU的預測 Object detection and image classification with Google Coral USB Accelerator(pyImageSearch)
  2. 基於tfslim的方式量化訓練 Quantizing neural networks to 8-bit using TensorFlow(armDevelop)
  3. 【Tensorflow系列】使用Inception_resnet_v2訓練自己的數據集並用Tensorboard監控(cnblogs)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章