迭代压缩
如何在压缩感知中正确使用阈值迭代算法? 测量[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量化。