如何優化和壓縮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網絡變得更瘦。
神經網絡的裁剪,目前也是學術的一個熱門研究方向,但是並不是每一個網絡結構都有裁剪的空間,通常來說,應該結合實際的需要,使用合適的技術手段,選擇一個合適大小的模型文件。