迭代壓縮
如何在壓縮感知中正確使用閾值迭代演算法? 測量[2]。重構演算法是依據對信號的測量和問題的稀疏性重構原始信號的技術。上述過程可以描述為 如下數學模型:設s ∈ RN 為原始信號,該信號在某組基{ψi }N 下具有稀疏表示s = Ψx,其中Ψ = i=1 [ψ1 , ψ2 , . . . , ψN ], = [x1 , x2 , . . . , xN ] ;給定測量矩陣Θ ∈ RM ×N , Θ可得到信號s的觀測值y, x 由 即 y = Θs = ΘΨx 其中Φ = ΘΨ ∈ RM ×N 稱為感測矩陣, 為采樣數;則從觀測數據y來恢復未知的稀疏向量x, M 進而恢 復原始信號s的問題可建模為下述L0 問題: x∈RN min x 0 s.t. y = Φx (1.1) 這里 x 0 為x的非零分量的個數。顯然L0 問題是一個組合優化問題(NP難問題[11]) 通常將其轉化到 , 一個稀疏優化問題求解: x∈RN min S(x) s.t. y = Φx (1.2) 這里S(x)是x的某個稀疏度量[16],例如對給定的q ∈ (0, 1],取S(x) = x q ,其中 x q 是x的q?准范 q 數。L0 問題(1.1)和稀疏優化問題(1.2)通常都納入如下的正則化框架來加以研究: x∈RN min Cλ (x) y ? Φx 2 + P (x; λ) (1.3) 其中λ > 0為正則化參數, (x; λ)為罰函數。 P 不同的罰函數對應不同的壓縮感知模型, 例如, (x; λ) = P 1/2 λ x 0 對應L0 問題; (x; λ) = λ x 1 對應L1 問題[8], (x; λ) = λ x 1/2 對應L1/2 問題[9], P P 等等。正則化 框架提供了壓縮感知研究的一般模型。通常,我們要求罰函數P (x; λ)具有某些特別性質,例如,我們 假設: (i) 非負性: (x; λ) P 0, ?x ∈ RN ; c}有界; 0; (ii) 有界性:對任何正常數c, 集合{x : P (x; λ) (iii) 可分性: (x; λ) = P N i=1 λp(xi ), p(xi ) 且 (iv) 原點奇異性: (x; λ)在x = 0處不可導, P 但在其它點處處可導。 本文目的是:從正則化框架(1.3)出發,研究並回答以下有關壓縮感知應用的四個基本問題:如 何從給定的罰函數導出壓縮感知問題的閾值表示?如何根據閾值表示設計閾值迭代演算法並建立其收 斂性理論? 如何應用閾值迭代演算法到壓縮感知問題? 如何針對不同特徵的壓縮感測問題選擇不同形式 的閾值迭代演算法?所獲結論期望為壓縮感知中如何正確使用閾值迭代演算法提供理論依據。 2 閾值迭代演算法與壓縮感測 本節討論前三個問題。作為預備, 我們首先簡要介紹閾值函數與閾值迭代演算法。 2.1 閾值函數 高效、 快速、 高精度的重構演算法是壓縮感知廣泛應用的前提。 閾值迭代演算法 Thresholding Iterative ( Algorithms)正是這樣一類十分理想的壓縮感知重構演算法,它因迭代簡單、可單分量處理、能有效 2 中國科學 第 40 卷 第 1 期 用於大規模高維問題而得到普遍推崇。Blumensath等[14]提出了求解近似L0 問題的Hard閾值迭代算 法, Daubechies等[15]提出了求解L1 問題的Soft閾值迭代演算法, 徐宗本等[9, 10, 16]提出了求解L1/2 問題 的Half和Chalf閾值迭代演算法。
㈡ 數據壓縮的基本原理
數據壓縮的基本原理
--------------------------------------------------------------------------------
數據壓縮技術就是對原始數據進行數據編碼或壓縮編碼。
目前常用的壓縮編碼有:冗餘壓縮法(無損壓縮法、熵編碼)和熵壓縮法(有損壓縮法)兩類。
無損壓縮是可逆的;有損壓縮是不可逆的。
--------------------------------------------------------------------------------
變長編碼
使用長度可變的代碼來對以不同頻率出現的樣本進行編碼。
1·Huffman編碼
Huffman編碼又稱最佳編碼。
Huffman編碼過程是:
*將信源符號按概率遞減順序排列;
*把兩個最小的概率加起來,作為新符號的概率;
*重復上述兩步驟,直到概率的和達到1為止;
*在每次合並消息時,將被合並的消息賦予1和0或賦予0和1;
*尋找從每一信源符號到概率為1的路經,記錄下路經上的1和0;
*對每一符號寫出從碼樹的根到終結點1、0序列。
例:對信源
[X1,X2,X3,X4,X5,X6]=[0.25,0.25,0.20,0.15,0.10,0.05]
進行Huffman編碼。
其中:X1=01;X2=10;X3=11;X4=000;X5=0010;X6=0011。
2·算術編碼
算術編碼是一種二元編碼。
這種編碼方法是在不考慮信源統計的情況下,只要監視一小段時間內碼字出現的頻率,不管統計是平穩的或非平穩的,編碼的碼率總能趨近於信源熵值,每次迭代的編碼演算法只處理一個數據符號,並且只有算術運算。
對二進制編碼來說,信源符號只有兩個。在算術編碼的初級階段,可設一個大概率Pe和小概率Qe,然後對被編碼比特流符號進行判斷。
其步驟:
*設編碼初始化子區間為[0,1],Qe從0算起,則Pe=1-Qe。
*確定子區間起始位置:子區間起始位置=前子區間的長度+ 當前符號的區間左端X前子區間長度
*確定新子區間長度:新子區間長度=前子區間的長度X當前符號的概率
*隨著被編碼數據流符號的輸入,子區間逐漸縮小,
*最後得到的子區間長度決定了表示該區域內的某一個數所需的位數。
例:P42
--------------------------------------------------------------------------------
預測編碼
(自習)
--------------------------------------------------------------------------------
變換編碼
變換編碼是指對信號進行變換後在編碼。
例如:
典型的編碼結構是:
--------------------------------------------------------------------------------
模型編碼
模型編碼是指採用模型的方法對傳輸的圖像進行參數估測。
模型編碼有:隨機馬爾可夫場和分形圖像編碼。
1·分形的概念
分形的含義是其組成部分以某種方式與整體相似的形(一類無規則、混亂而復雜),其局部與整體有相似性的體系,即:自相似性體系。
2·分形編碼
*基本原理:分形的方法是把一幅數字圖像,通過一些圖像處理技術將原始圖像分成一些子圖像,然後在分形集中查找這樣的子圖像。分形集存儲許多迭代函數,通過迭代函數的反復迭代,可以恢復原來的子圖像。
分形編碼壓縮的步驟:
第一步:把圖像劃分為互不重疊的、任意大小的的D分區;
第二步:劃定一些可以相互重疊的、比D分區大的R分區;
第三步:為每個D分區選定仿射變換表。
分形編碼解壓步驟:
首先從文件中讀取D分區劃分方式的信息和仿射變換系數等數據;
然後劃定兩個同樣大小的緩沖區給D圖像和R圖像,並把R初始化到任一初始階段;
根據仿射變換系數把其相應的R分區做仿射變換,並用變換後的數據取代該D分區的原有數據;
對D中所有的D分區都進行上述操作,全部完成後就形成一個新的D圖像;
再把新D圖像的內容拷貝到R中,把新R當作D,D當作R,重復操作(迭代)。
。分形編碼的特點:
壓縮比高,壓縮後的文件容量與圖像像素數無關,在壓縮時時間長但解壓縮速度快。
--------------------------------------------------------------------------------
㈢ 數字圖像壓縮技術
㈣ pytorch模型壓縮方法總結
一個是在channel粒度上做剪枝,另一個是在神經元Unit維度上做剪枝
1.torch.quantize_per_tensor()函數的scale和zero_point需要自己設定。
所謂動態是指這個函數torch.quantization.quantize_dynamic能自動選擇最合適的scale和zero_point。
QuantStub使用的是HistogramObserver,根據輸入從[-3,3]的分布,HistogramObserver計算得到min_val、max_val分別是-3、2.9971,而qmin和qmax又分別是0、127,其schema為per_tensor_affine,因此套用上面的per_tensor_affine邏輯可得:
Post Training Dynamic Quantization,簡稱為Dynamic Quantization,也就是動態量化,或者叫作Weight-only的量化,是提前把模型中某些op的參數量化為INT8,然後在運行的時候動態的把輸入量化為INT8,然後在當前op輸出的時候再把結果requantization回到float32類型。動態量化默認只適用於Linear以及RNN的變種。
當對整個模型進行轉換時,默認只對以下的op進行轉換:
Linear
LSTM
LSTMCell
RNNCell
GRUCell
為啥呢?因為dynamic quantization只是把權重參數進行量化,而這些layer一般參數數量很大,在整個模型中參數量佔比極高,因此邊際效益高。對其它layer進行dynamic quantization幾乎沒有實際的意義。
與其介紹post training static quantization是什麼,我們不如先來說明下它和dynamic quantization的相同點和區別是什麼。相同點就是,都是把網路的權重參數轉從float32轉換為int8;不同點是,需要把訓練集或者和訓練集分布類似的數據喂給模型(注意沒有反向傳播),然後通過每個op輸入的分布特點來計算activation的量化參數(scale和zp)——稱之為Calibrate(定標)。是的,靜態量化包含有activation了,也就是post process,也就是op forward之後的後處理。為什麼靜態量化需要activation呢?因為靜態量化的前向推理過程自(始+1)至(終-1)都是INT計算,activation需要確保一個op的輸入符合下一個op的輸入。
PyTorch會使用五部曲來完成模型的靜態量化:
這一步不是訓練。是為了獲取數據的分布特點,來更好的計算activation的scale和zp。至少要喂上幾百個迭代的數據,
per tensor 和 per channel。Per tensor 是說一個tensor里的所有value按照同一種方式去scale和offset; per channel是對於tensor的某一個維度(通常是channel的維度)上的值按照一種方式去scale和offset,也就是一個tensor里有多種不同的scale和offset的方式(組成一個vector),如此以來,在量化的時候相比per tensor的方式會引入更少的錯誤。PyTorch目前支持conv2d()、conv3d()、linear()的per channel量化。