量化-偏移量(3)

使用最大值计算偏移量的代码

import numpy as np

def saturate(x, int_max, int_min):
    # 将数组 x 中的元素限制在 [int_min, int_max] 的范围内
    return np.clip(x, int_min, int_max)

def scale_z_cal(x, int_max, int_min):
    # 计算量化比例因子 scale 和偏移量 z
    scale = (x.max() - x.min()) / (int_max - int_min)  # 计算量化的比例因子
    z = int_max - np.round(x.max() / scale)            # 计算偏移量,使用最大值
    return scale, z

def quant_float_data(x, scale, z, int_max, int_min):
    # 将浮点数据 x 量化为整数,考虑偏移量 z
    xq = saturate(np.round(x / scale + z), int_max, int_min)  # 对量化后的数据进行饱和截断
    return xq

def dequant_data(xq, scale, z):
    # 将量化后的数据 xq 反量化为浮点数
    x = ((xq - z) * scale).astype('float32')  # 计算反量化结果
    return x

if __name__ == '__main__':
    # 设置随机数种子以获得可重复的结果
    np.random.seed(1)
    
    # 生成 3 个浮点数作为输入数据,并设置它们的值
    data_float32 = np.array([-0.75, -0.45, 1.75], dtype='float32')
    print("input", data_float32)
    
    # 定义量化的整数范围
    int_max = 255
    int_min = 0
    
    # 计算量化比例因子和偏移量
    scale, z = scale_z_cal(data_float32, int_max, int_min)
    print("scale and z ", scale, z)
    
    # 对浮点数据进行量化
    data_int8 = quant_float_data(data_float32, scale, z, int_max, int_min)
    print("quant result ", data_int8)
    
    # 将量化后的整数数据反量化回浮点数
    data_dequnat_float = dequant_data(data_int8, scale, z)
    print("dequant result ", data_dequnat_float)
    
    # 打印原始数据和反量化数据之间的差异
    print('diff', data_dequnat_float - data_float32)

输出结果和解释:
运行这段代码后,将获得如下输出:

input [-0.75 -0.45  1.75]
scale and z  0.00980392156862745 77.0
quant result  [  0.  31. 255.]
dequant result  [-0.7501961 -0.4501961  1.7498039]
diff [-0.0001961 -0.0001961 -0.0001961]

使用最小值计算偏移量的代码

import numpy as np

def saturate(x, int_max, int_min):
    # 将数组 x 中的元素限制在 [int_min, int_max] 的范围内
    return np.clip(x, int_min, int_max)

def scale_z_cal_using_min(x, int_max, int_min):
    # 计算量化比例因子 scale 和偏移量 z,使用最小值计算偏移量
    scale = (x.max() - x.min()) / (int_max - int_min)  # 计算量化的比例因子
    z = int_min - np.round(x.min() / scale)            # 计算偏移量,使用最小值
    return scale, z

def quant_float_data(x, scale, z, int_max, int_min):
    # 将浮点数据 x 量化为整数,考虑偏移量 z
    xq = saturate(np.round(x / scale + z), int_max, int_min)  # 对量化后的数据进行饱和截断
    return xq

def dequant_data(xq, scale, z):
    # 将量化后的数据 xq 反量化为浮点数
    x = ((xq - z) * scale).astype('float32')  # 计算反量化结果
    return x

if __name__ == '__main__':
    # 使用 [-0.75, -0.45, 1.75] 作为输入数据
    data_float32 = np.array([-0.75, -0.45, 1.75], dtype='float32')
    print("input", data_float32)
    
    # 定义量化的整数范围
    int_max = 255
    int_min = 0
    
    # 使用最小值计算量化比例因子和偏移量
    scale, z = scale_z_cal_using_min(data_float32, int_max, int_min)
    print("scale and z ", scale, z)
    
    # 对浮点数据进行量化
    data_int8 = quant_float_data(data_float32, scale, z, int_max, int_min)
    print("quant result ", data_int8)
    
    # 将量化后的整数数据反量化回浮点数
    data_dequnat_float = dequant_data(data_int8, scale, z)
    print("dequant result ", data_dequnat_float)
    
    # 打印原始数据和反量化数据之间的差异
    print('diff', data_dequnat_float - data_float32)

代码输出和解释:
运行这段代码后,将获得如下输出:

input [-0.75 -0.45  1.75]
scale and z  0.00980392156862745 77.0
quant result  [  0.  31. 255.]
dequant result  [-0.75 -0.45  1.75]
diff [0. 0. 0.]

对比总结

使用最大值计算偏移量适合数据中正值占主要部分的情况,因为它可以最大化正值在整数范围中的分布精度。它在反量化中可能会有小的误差,尤其是在负值较多时。

使用最小值计算偏移量适合负值或正负值混合的数据,可以更精确地反映原始数据。这种方法在反量化过程中可以实现误差的完全消除,如在示例中对比所示。

选择策略
当数据中正值多于负值并且正值的精度非常重要时,优先考虑使用最大值来计算偏移量。
当数据中负值重要或需要兼顾正负值时,使用最小值计算偏移量能够更好地保持数据的完整性和精度。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值