pytorch框架下的参数量化(量化为任意位数,或2的幂次方)

pytorch框架下参数渐进量化的实现

将pytorch框架下的参数量化为特定形式,会产生一定的误差,这篇博客以MINIST数据集,LSTM量化为例,主要写了量化的详细流程,并附上完整程序。


一、量化原理

本博客介绍的量化方式,可以将参数量化成任何形式,但量化后的参数不支持反向传播,即不能再训练。
LSTM

LSTM共有8个权重矩阵,如果直接量化,会产生较大的误差,因此本博客采用渐进量化的策略来减少误差。量化流程如下:

    1. 先训练模型,等待收敛
    1. 量化Wi,将量化后的Wi保存为常数,对模型进行再训练(此时模型可训练参数只有7个权重矩阵和4个bias)
    1. 量化Ui,将量化后的Ui保存为常数,对模型进行再训练(此时模型可训练参数只有6个权重矩阵和4个bias)
    1. 依此类推,最终量化引起的误差,只有量化最后一个权重矩阵产生的误差

以下是完整的程序实现流程


二、自定义RNN框架

pytorch自带的nn.LSTM只有两个权重矩阵,他将Wi,Wf,Wo,Wc四个矩阵合并成一个矩阵,将Ui,Uf,Uo,Uc四个矩阵合并成一个矩阵,因此不适合这种量化方式,需要自定义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
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值