非对称量化
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)
网友评论