pytorch框架下参数渐进量化的实现
将pytorch框架下的参数量化为特定形式,会产生一定的误差,这篇博客以MINIST数据集,LSTM量化为例,主要写了量化的详细流程,并附上完整程序。
一、量化原理
本博客介绍的量化方式,可以将参数量化成任何形式,但量化后的参数不支持反向传播,即不能再训练。

LSTM共有8个权重矩阵,如果直接量化,会产生较大的误差,因此本博客采用渐进量化的策略来减少误差。量化流程如下:
-
- 先训练模型,等待收敛
-
- 量化Wi,将量化后的Wi保存为常数,对模型进行再训练(此时模型可训练参数只有7个权重矩阵和4个bias)
-
- 量化Ui,将量化后的Ui保存为常数,对模型进行再训练(此时模型可训练参数只有6个权重矩阵和4个bias)
-
- 依此类推,最终量化引起的误差,只有量化最后一个权重矩阵产生的误差
以下是完整的程序实现流程
二、自定义RNN框架
pytorch自带的nn.LSTM只有两个权重矩阵,他将Wi,Wf,Wo,Wc四个矩阵合并成一个矩阵,将Ui,Uf,Uo,Uc四个矩阵合并成一个矩阵,因此不适合这种量化方式,需要自定义LSTM层;
- 自定义RNN代码:自定义RNN结构
自定义LSTM部分代码如下:
class LSTMCell(RNNCellBase):
def __init__(self, input_size, hidden_size, bias=True, grad_clip=None):
super(LSTMCell, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.grad_clip = grad_clip
self.weight_ix = Parameter(torch.Tensor(hidden_size, input_size))
self.weight_ih = Parameter(torch.Tensor(hidden_size, hidden_size))
self.weight_cx = Parameter(torch.Tensor(hidden_size, input_size))
self.weight_ch = Parameter(torch.Tensor(hidden_size, hidden_size))
self.weight_ox = Parameter(torch.Tensor(hidden_size, input_size))
self.weight_oh = Parameter(torch.Tensor(hidden_size, hidden_size))
self.weight_fx = Parameter(torch.Tensor(hidden_size, input_size))
self.weight_fh = Parameter(torch.Tensor(hidden_size, hidden_size))
if bias:
self.bias_i = Parameter(torch.Tensor(hidden_size))
self.bias_f = Parameter(torch.Tensor(hidden_size))
self.bias_g = Parameter(torch.Tensor(hidden_size))
self.bias_o = Parameter(torch

&spm=1001.2101.3001.5002&articleId=112426594&d=1&t=3&u=e4ef1ef81a2445d7acf308a5ab990e54)
1万+

被折叠的 条评论
为什么被折叠?



