模型量化学习笔记

2023-03-26  本文已影响0人  leon_tly

非对称量化

import numpy as np

# 数据截断
def clip(xq, int_max, int_min):
    return np.clip(xq, int_min, int_max)

# 计算scale, Z
def cal_scale_z(x, int_max, int_min):
    scale = (x.max() - x.min()) / (int_max - int_min)
    z     = int_max - np.round(x.max() / scale)
    return scale, z

# 量化
def quant(x, scale, z, int_max, int_min):
    xq = np.round(x / scale) + z
    xq = clip(xq, int_max, int_min).astype('int8')
    return xq

# 反量化
def dequant(xq, scale, z):
    x = ((xq - z) * scale).astype("float32")
    return x

if __name__ == "__main__":
    np.random.seed(1)
    data_float32 = np.random.randn(3).astype('float32')
    print("[float32 data] ", data_float32)

    int_max = 127
    int_min = -128

    scale , z = cal_scale_z(data_float32, int_max, int_min)
    print("[scale, z] ", scale, z)

    data_int8 = quant(data_float32, scale, z, int_max, int_min)
    print("[quant] ", data_int8)

    data_dequant_float32 = dequant(data_int8, scale, z)
    print("[dequant] ", data_dequant_float32)

    diff = data_float32 - data_dequant_float32
    print("[diff] ", diff)
上一篇 下一篇

猜你喜欢

热点阅读