量化的概念:
量化(quantitative),這裡不是指金融上的量化交易,而是指離散化。量化是乙個總括術語,是用比 32 位浮點數更少的空間來儲存和執行模型,並且 tensorflow 量化的實現遮蔽了儲存和執行細節。
神經網路訓練時要求速度和準確率,訓練通常在 gpu 上進行,所以使用浮點數影響不大。但是在**階段,使用浮點數會影響速度。量化可以在加快速度的同時,保持較高的精度。
量化網路的動機主要有兩個。最初的動機是減小模型檔案的大小。模型檔案往往佔據很大的磁碟空間,有時,每個模型都接近 200 mb,模型中儲存的是分布在大量層中的權值。在儲存模型的時候用 8 位整數,模型大小可以縮小為原來 32 位的 25%左右。在載入模型後運算時轉換回 32 位浮點數,這樣已有的浮點計算**無需改動即可正常執行。
量化的另乙個動機是降低**過程需要的計算資源。這在嵌入式和移動端非常有意義,能夠更快地執行模型,功耗更低。從體系架構的角度來說,8 位的訪問次數要比 32 位多,在讀取 8 位整數時只需要 32 位浮點數的 1/4 的記憶體頻寬,例如,在 32 位記憶體頻寬的情況下,8 位整數可以一次訪問 4 個,32 位浮點數只能 1 次訪問 1 個。而且使用 simd 指令(19.2節會加速介紹該指令集),可以在乙個時鐘週期裡實現更多的計算。另一方面,8 位對嵌入式裝置的利用更充分,因為很多嵌入式晶元都是 8 位、16 位的,如微控制器、數字訊號處理器(dsp 晶元),8 位可以充分利用這些。
此外,神經網路對於雜訊的健壯性很強,因為量化會帶來精度損失(這種損失可以認為是一種雜訊),並不會危害到整體結果的準確度。
那能否用低精度格式來直接訓練呢?答案是,大多數情況下是不能的。因為在訓練時,儘管前向傳播能夠順利進行,但往往反向傳播中需要計算梯度。例如,梯度是 0.2,使用浮點數可以很好地表示,而整數就不能很好地表示,這會導致梯度消失。因此需要使用高於 8 位的值來計算梯度。因此,正如在本節一開始介紹的那樣,在移動端訓練模型的思路往往是,在 pc 上正常訓練好浮點數模型,然後直接將模型轉換成 8 位,移動端是使用 8 位的模型來執行**的過程。
sudo bazel build tensorflow/tools/quantization:quantize_graph
3:開始量化.pb檔案
sudo bazel-bin/tensorflow/tools/quantization/quantize_graph --input=/tmp/pnet_output.pb --output_node_names="bbox_pred_out,cls_prob_out,landmark_pred_out" --output=/tmp/newpb/pnet_output.pb --mode=eightbit
原文:
onnx模型轉tensorflow模型
onnx是開源神經網路交換平台,有了它基本上不用糾結用什麼深度學習框架的問題了。我現在記錄一下怎麼將onnx模型轉換成tensorflow模型。1 安裝tensorflow和onnx 我是通過anaconda安裝的。詳情 這個部落格記載了安裝anaconda和onnx的詳情,安裝好anaconda後...
TensorFlow模型恢復報錯
錯誤資訊attempting to use uninitialized value input producer input producer limit epochs epochs今天在模型恢復的時候出現上圖報錯資訊,最後發現是由於呼叫tf.train.slice input producer方法...
tensorflow執行模型 會話
tensorflow的會話 session 用來執行定義好的運算。會話擁有並管理tensorflow程式執行時的所有資源。當所有計算完成後要關閉會話來幫助系統 資源,否則可能出現資源洩露的問題。tensorflow中的會話的使用模式有兩種 1 第一種模式需要明確呼叫會話生成函式和關閉會話函數。流程 ...