量化位宽问题

量化到低于16bit的神经网络已经很常见了,浮点数据类型主要有float16和double32,8bit以下的数据类型表示在程序中是怎么进行的一直很疑惑。

从github中找到的代码中,量化函数的完成方式为:

//真正起作用的量化函数
class Quantizer(Function):
    @staticmethod
    def forward(ctx, input, nbit):
        scale = 2 ** nbit - 1
        return torch.round(input * scale) / scale

    @staticmethod
    def backward(ctx, grad_output):
        return grad_output, None

可以看到,代码使用的是STE量化,量化位宽决定了scale的大小,而scale的大小决定了有效数字的位数,从数学角度来看,确实是实现了低bit量化。

但是,此处返回的量化值很明显还是float类型的,所以并没有真正在存储层面实现定点低bit量化。

不过在FPGA中,本身就有低位宽的表示方式:

ap_int<4>

在存储时,可以考虑将scale乘回weight和activation,将它们转换为字符串存储即可实现低bit的存储。

[1] https://github.com/coldlarry/YOLOv3-complete-pruning
[2] Zhou, Shuchang, et al. “Dorefa-net: Training low bitwidth convolutional neural networks with low bitwidth gradients.” arXiv preprint arXiv:1606.06160 (2016).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值