tensorflow 量化和裁剪的資料


如何優化和壓縮tensorflow模型

一 優化模型

移動設備有很大的局限性,因此可以進行任何可以減少應用程序占用空間的預處理值得考慮。

TensorFlow庫的一種方式是保持較小的移動性,只支持在推理期間常用的操作子集。這是一個合理的方法,因為在移動平台上很少進行培訓。同樣,它也排除了對大型外部依賴關系的操作的支持。您可以在tensorflow / contrib / makefile / tf_op_files.txt文件中看到支持的操作列表。

默認情況下,大多數圖表包含TensorFlow的移動版本不支持的培訓操作。。TensorFlow不會加載包含不受支持操作的圖(即使不支持的操作與推斷無關)。

優化推理

為了避免由不受支持的培訓操作引起的問題,TensorFlow安裝包括一個工具optimize_for_inference,可刪除給定的一組輸入和輸出不需要的所有節點。

該腳本還進行了一些其他優化,可以幫助加快模型,例如將顯式批量歸一化操作合並到卷積權重中以減少計算次數。這可以根據輸入型號提供30%的速度。運行腳本的方法如下:

python -m tensorflow.python.tools.optimize_for_inference \

  --input = tf_files / retrained_graph.pb \

  --output = tf_files / optimized_graph.pb \

  --input_names =“input”\

  --output_names = “final_result”

運行此腳本將在此創建一個新文件tf_files/optimized_graph.pb。

驗證優化模型

要檢查optimize_for_inference 沒有改變網絡的輸出,比較label_image輸出retrained_graph.pb與的optimized_graph.pb:

python -m scripts.label_image \

  --graph = tf_files / retrained_graph.pb \

  --image = tf_files / flower_photos /菊花/ 3475870145_685a19116d.jpg

python -m scripts.label_image \

    --graph = tf_files / optimized_graph.pb \

    --image = tf_files / flower_photos /菊花/ 3475870145_685a19116d.jpg

當我運行這些命令時,我看到輸出概率沒有改變為5位小數。

現在運行它,以確認您看到類似的結果。

用TensorBoard調查變化

如果您遵循第一個教程,您應該有一個tf_files/training_summaries/目錄(否則,只需通過發出以下Linux命令創建目錄:)mkdir tf_files/training_summaries/。

以下兩個命令會殺死任何運行的TensorBoard實例並啟動一個新實例,在后台觀察該目錄:

pkill -f張量板

張量紙--logdir tf_files / training_summaries&

在后台運行的TensorBoard可能會偶爾向您的終端打印以下警告,您可以安全地忽略該警告

WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404.

現在將兩個圖形添加為TensorBoard日志:

python -m scripts.graph_pb2tb tf_files / training_summaries / retrained \

  tf_files / retrained_graph.pb

 

python -m scripts.graph_pb2tb tf_files / training_summaries / optimized \

  tf_files / optimized_graph.pb

現在打開TensorBoard,並導航到“圖形”選項卡。然后從左側標有“運行”的選擇列表中選擇“再培訓”。

瀏覽圖表,然后從“運行”菜單中選擇“優化”。

從這里可以確認已經合並了一些節點來簡化圖表。您可以通過雙擊來擴展各個塊。

二 http://blog.csdn.net/baidu_37967613/article/details/72678003

為什么量化是可能的?

由於神經元只抽取必要信息並給出響應,這樣整個網絡是抗噪和魯棒的。訓練完成后進行推斷時,減低精度的定點化量化也可以考慮為噪聲,因此不會產生大影響。

 

如何量化和量化意義?

網絡參數是按層組織,每層數值都在同一數量級,即范圍相差不大,如[-6.0,4.0],有大量論文研究表明確認值最大和最小后每層數據使用8bit定點化量化已可以很好滿足推斷計算。

量化最直接結果是參數存儲空間要求變小,經驗值是減少約3/4;減少內存讀取數據量,節省帶寬;使用simd進行計算加速,如果有dsp進行8bit加速計算節能,使得移動設備上進行推斷計算變得更強大有效。

 

 

怎么量化模型?

需要使用tensorflow提供的量化工具,使用示例如下

[plain] view plain copy

bazel-bin/tensorflow/tools/quantization/quantize_graph \ 

  --input=/tmp/classify_image_graph_def.pb \ 

  --output_node_names="softmax" --output=/tmp/quantized_graph.pb \ 

  --mode=eightbit 

 

 

該工具需要下載tensorflow源碼,安裝bazel(可參見blog.csdn.net/u010510350/article/details/52247972),並進行配置和編譯生成。

編譯前請確認tensorflow源碼下載后,已進行./configure, 這個過程會配置相關的依賴程序和庫。為了使得依賴少一些,可以在configure時選擇不打開一些選項。

bazel build tensorflow/tools/quantization:quantize_graph  #具體路徑可能會隨版本變化

生成的可執行文件在bazel-bin/tensorflow/tools/quantization/quantize_graph,此時即可進行量化轉化了,--help可以打開使用幫助。

 

此時需要了解輸出節點的名稱,如上“softmax”,如果你是網絡的原本的開發人員,這個不是問題。如果手頭得到的就是一個pb文件。那么就需要自己分析文件了。這個下個文檔再介紹。

 

http://blog.csdn.net/u011961856/article/details/76736103

#編譯量化工具

sudo bazel build tensorflow/contrib/quantization/tools:quantize_graph

#運行后報錯:

ERROR: no such package 'tensorflow/contrib/quantization/tools': BUILD file not found on package path.

#修改命令為:

sudo bazel build tensorflow/tools/quantization:quantize_graph

 

http://fjdu.github.io/machine/learning/2016/07/07/quantize-neural-networks-with-tensorflow.html

https://www.tensorflow.org/performance/quantization

http://cwiki.apachecn.org/pages/viewpage.action?pageId=10029447

http://blog.csdn.net/masa_fish/article/details/56049710?winzoom=1

https://zhuanlan.zhihu.com/p/27191354

https://zhuanlan.zhihu.com/p/27191354

裁剪tensorflow

Tensorflow是一個很龐大的框架,對於手機來說,它占用的體積是比較大的,所以需要盡量的縮減tensorflow庫占用的體積。

第一種裁剪的方案:

其實在解決前面遇到的那個crash問題的時候,已經指明了一種裁剪的思路,既然mobile版的tensorflow本來就是pc版本的一個子集,那就意味着可以根據具體的需要,讓這個子集變得更小,這也就是達到了裁剪的目的。具體來說,就是修改tensorflow源碼中的tensorflow/tensorflow/conrib/makefile/tf_op_files.txt文件,只保留使用到了的模塊,針對HED網絡,原有的200多個模塊裁剪到只有46個模塊,裁剪過后的tf_op_files.txt文件如下:見鏈接中的圖

需要強調的一點是,這種操作思路,是針對不同的神經網絡結構有不同的裁剪方式,原則就是用到什么模塊就保留什么模塊。當然,因為有些模塊之間還存隱含的依賴關系,所以裁剪的時候也是要反復多次才能成功的。

第二種裁剪方法

編譯級別的strip操作,在連接的時候會自動的把沒有調用的函數去除掉(集成開發環境里通常已經自動將這些參數設置成了最佳組合)

借助一些高級技巧和工具,對二進制文件進行瘦身。

裁剪效果的對比:

借助所有這些的裁剪手段,最終我們的ipa安裝包的大小只增加了3M,如果不做手動裁剪這一步的話,那么ipa的增量,則是30M左右。

模型的裁剪

以HED模型為例

論文中的HED模型文件的大小為56M,對於手機來說也是比較大的,需要將HED網絡進行裁剪。

HED網絡是VGG 16 作為基礎網絡結果,而VGG又是一個得到廣泛驗證的基礎網絡結構,因此修改HED的整體結構肯定不是一個明智的選擇。

現在的需求只是檢測舉行區域的邊緣,而並不是檢測通用場景下的廣義的邊緣,可以認為前者的復雜度比后者低,所以一種可行的思路。就是保留HED的整體結構,修改VGG每一組卷機層里面的卷積核心的數量,讓HED網絡變得更瘦。

 

神經網絡的裁剪,目前也是學術的一個熱門研究方向,但是並不是每一個網絡結構都有裁剪的空間,通常來說,應該結合實際的需要,使用合適的技術手段,選擇一個合適大小的模型文件。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM