1. 程式人生 > >TensorFlow技術內幕(十一):模型優化之量化(Quantize)

TensorFlow技術內幕(十一):模型優化之量化(Quantize)

背景

  • Neural Network模型一般都會佔用很大的磁碟空間,比如AlexNet的模型檔案就超過了200 MB.模型包含了數百萬的引數,絕大部分的空間都用來儲存這些模型的引數了。這些引數是浮點數型別的,普通的壓縮演算法很難壓縮它們的空間。
  • 一般模型的內部的計算都採用了浮點數計算,浮點數的計算會消耗比較大的計算資源(空間和cpu/gpu時間),如果在不影響模型準確率的情況下,模型內部可以採用其他簡單數值型別進行計算的話,計算速度會提高很多,消耗的計算資源會大大減小,尤其是對於移動裝置來說,這點尤其重要。

由此引入量化技術。

Quantize

Mathematics, Physics. to
restrict (a variable quantity) to discrete values rather than to a continuous set of values.

對於模型檔案的量化壓縮,過程比較簡單。我們發現模型屬於同一層的引數值會分佈在一個較小的區間內,比如-3, 5之間,我們可以記下這個最小值和最大值,在採用8位數量化(可以有其他選擇)的情況下,可以把同一層的所有引數都線性對映(也可以採用非線性對映進一步壓縮空間)到區間[-3, 5]之間的255個8位整數中的最接近的一個數,例如如下對映:

float  | Quantized 
-------+----------
-3.0 | 0 5.0 | 255 0.92 | 125

這樣模型檔案的大小就基本壓縮到了原來的25%,而且在載入的時候可以恢復到原來的數值,當然恢復的數值跟壓縮之前會有差異,但事實證明,模型對這種壓縮照成的噪音表現的很健壯。

滿足第一個需求就這麼簡單,模型不需要改變,需要改變的是模型的儲存和載入部分;但是要解決第二個問題就不這麼簡單了,事實證明,模型內部的計算如果都採用8位整形數來計算的話,模型的表現會相差很大,原因是模型的訓練過程中,需要計算梯度,然後運用一定的學習演算法,不斷的更新引數,每次的更新量可能是很小的。所以模型的訓練過程需要高精度的浮點型數值的。那麼模型的預測過程是否可以使用整形數值代替呢?事實證明是可行的。

TensorFlow中模型的量化過程是這樣實現的:

  • 將模型中實現了對應的量化操作的操作符替換成量化操作符,例如圖1是原始的計算圖,圖2是量化後的計算圖。

這裡寫圖片描述

圖1

這裡寫圖片描述

圖2
  • 優化量化處理後的計算圖,去掉冗餘操作,如下圖3

這裡寫圖片描述

圖3

實踐

以inception模型為例,可以通過下列命令操作量化模型:

$ curl http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz -o /tmp/inceptionv3.tgz
$ tar xzf /tmp/inceptionv3.tgz -C /tmp/
$ bazel build tensorflow/contrib/quantization/tools:quantize_graph
$ bazel-bin/tensorflow/contrib/quantization/tools/quantize_graph \
--input=/tmp/classify_image_graph_def.pb \
--output_node_names="softmax" --output=/tmp/quantized_graph.pb \
--mode=eightbit

相關推薦

TensorFlow技術內幕模型優化量化Quantize

背景 Neural Network模型一般都會佔用很大的磁碟空間,比如AlexNet的模型檔案就超過了200 MB.模型包含了數百萬的引數,絕大部分的空間都用來儲存這些模型的引數了。這些引數是浮點數型別的,普通的壓縮演算法很難壓縮它們的空間。 一般模型的內部

java double-check lazy load------effedctive java 第七慎用延遲初始化這個變數的作用是確保field只在已經被初始化的情況下讀取

private volatile FieldType field; FieldType getField(){ FieldType result = field; if(result==null){ synchronized(this){ re

SharePoint 2016效能優化和高可用,SP中的WEB內容管理功能

SHAREPOINT SERVER 2016中的WEB內容管理功能 根據SharePoint MPP 課程,下面幾個文章介紹,SP16 效能優化和高可用的下一部分,Web內容管理功能。 SharePoint Server 2016中的Web內容管理包含用於配置,自定義,優

《SQL入門經典》筆記第四章建立資料庫去規格化資料庫

1. 什麼是去規格化? 去規格化是通過修改規格化資料庫的表的構成,在允許一定程度的資料冗餘的情況下,提高資料庫庫效能。   2. 為什麼要去規格化? 嘗試提高效能是進行去規格化資料庫的唯一原因(規格化的資料庫需要頻繁地進行表的結合,效能會降低)。   3.

《SQL入門經典》筆記第三章建立資料庫管理資料庫物件

1. 什麼是資料庫物件? 資料庫物件用於儲存或引用資料,需要被定義,例如表、試圖、簇、序列、索引和異名(讓表具有另一個名稱)。   2. 什麼是規劃? 規劃是與資料庫某個使用者名稱相關聯的資料庫物件集合。相應的使用者名稱被稱為“規劃所有人”/“關聯物件組的所有人”。 同

SpringBoot | 第二非同步開發非同步呼叫

前言 上一章節,我們知道了如何進行非同步請求的處理。除了非同步請求,一般上我們用的比較多的應該是非同步呼叫。通常在開發過程中,會遇到一個方法是和實際業務無關的,沒有緊密性的。比如記錄日誌資訊等業務。這個時候正常就是啟一個新執行緒去做一些業務處理,讓主執行緒非同步的執行其他業

理解Docker8Docker 儲存Volume

1. Docker volume 的幾種形態     有狀態容器都有資料持久化需求。前一篇文章中提到過,Docker 採用 AFUS 分層檔案系統時,檔案系統的改動都是發生在最上面的容器層。在容器的生命週期內,它是持續的,包括容器在被

Spring BootScheduling Tasks定時任務

幾乎大部分的應用都會有定時執行任務的需求。使用Spring Boot的Scheduling Tasks能夠提高您的開發效率。這篇文章將介紹怎麼通過Spring Boot去做排程任務。 構建工程 建立一個Springboot工程,在它的程式入口加上@EnableScheduling

Linux學習四劍客grep、find

linux四劍客 grep 查詢檔案內容 grep hello test.txt 在某個檔案中查詢包含hello的內容,只要一行中有hello會把整行顯示 grep -niv helle test.txt n顯示查詢到的內容行號,i查詢時不區分大小寫,v

、Hibernate查詢優化策略設定

使用Hibernate查詢一個物件的時候,查詢其關聯物件.應該如何查詢,可以通過配置對映檔案的屬性來設定。 lazy屬性: 解決查詢的時機的問題,是否延遲載入關聯資料,例如下面2條語句: Customer c1 = (Customer) session.get(Customer.cl

機器學習筆記 TensorFlow實戰三MNIST數字識別問題

1 - MNIST數字識別問題 前面介紹了這樣用TensorFlow訓練一個神經網路模型和主要考慮的問題及解決這些問題的常用方法。下面我們用一個實際的問題來驗證之前的解決方法。 我們使用的是MNIST手寫數字識別資料集。在很多深度學習教程中,這個資料集都會被當做一個案例。 1.1

區塊鏈技術基礎語言Go語言網路程式設計

原文連結:區塊鏈技術基礎語言(三十一):Go語言網路程式設計(上)   一、網路概述   1.1 網路協議 網路協議就是為網路資料交換而制定的規則、約定與標準。   1.2 分層模型 為了降低網路設計的複雜性,絕大多數網路都組織成一堆相互

tensorflow學習筆記seq2seq Model相關介面介紹

原始碼地址 呼叫外部的函式介紹 tf.sampled_softmax_loss() tf.sampled_softmax_loss()中呼叫了_compute_sampled_logits() 關於__compute_sampled_logits()

一起talk C栗子吧第一百三C語言實例--C程序內存布局三

view tracking 變化 content easy 內存 ask tex 延伸 各位看官們,大家好。上一回中咱們說的是C程序內存布局的樣例,這一回咱們繼續說該樣例。閑話休提,言歸正轉。讓我們一起talk C栗子吧。 看官們,關於C程序內

EF學習筆記實施繼承

long cannot oid data- turn cati com list pac 學習總目錄:ASP.NET MVC5 及 EF6 學習筆記 - (目錄整理) 上篇鏈接:EF學習筆記(十) 處理並發 本篇原文鏈接:Implementing Inheritance 面

DockerDocker實戰部署HTTPS的Tomcat站點

pos 容器 image avi tor 基礎 oot stat ask 1、選擇基礎鏡像    docker pull tomcat:7.0-jre8 2、生成HTTPS證書   keytool -genkey -alias tomcat -keyalg RSA -key

R語言學習筆記廣義線性模型

學習筆記 Education 5.0 1.3 style only 可能性 div erro #Logistic 回歸 install.packages("AER") data(Affairs,package="AER") summary(Affairs) a

springboot集成swagger2,構建優雅的Restful API

html 風格 lan round amt select() hash 指定 model   聲明:本部分內容均轉自於方誌明博友的博客,因為本人很喜歡他的博客,所以一直在學習,轉載僅是記錄和分享,若也有喜歡的人的話,可以去他的博客首頁看:http://blog.csdn.n

Python+Selenium筆記配置selenium Grid

find arch 自己 {} get 說明 前言 mon AC (一) 前言 Selenium Grid可以將測試分布在若幹個物理或虛擬機器上,從而實現分布方式或並行方式執行測試。 這個鏈接是官方的相關說明。 https://github.com/SeleniumHQ/s

Python筆記多線程

st2 pv操作 出現 end 談話 col 隊列大小 == done (二)和(三)不感興趣的可以跳過,這裏參考了《深入理解計算機系統》第一章和《Python核心編程》第四章 (一) 多線程編程 一個程序包含多個子任務,並且子任務之間相互獨立,讓這些子任務同時運