神经网络量化基础(1)——模型的构建与基础量化函数的实现(下)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 神经网络量化基础神经网络量化基础(1)——模型的构建与基础量化函数的实现神经网络量化基础(2)——量化模型的实现

4. 基础的量化函数

4.1 计算尺度因子和零点

首先我们需要把量化的基本公式实现。他们分别求出缩放尺度(scale)和 零点(zero point)。

其代码如下所示:

"""
计算量化尺度和零点
:min_val: 最小值
:scale: 最大值
:num_bits: 量化后的bit位
:returns: 量化尺度; 零点
"""
def calcScaleZeroPoint(min_val, max_val, num_bits=8):
    qmin = 0.
    qmax = 2. ** num_bits - 1.
    scale = float((max_val - min_val) / (qmax - qmin))
    zero_point = qmax - max_val / scale
    if zero_point < qmin:
        zero_point = qmin
    elif zero_point > qmax:
        zero_point = qmax
    zero_point = int(zero_point)
    return scale, zero_point

4.2 量化与反量化

计算出缩放尺度和零点值后我们需要构建量化和反量化函数,主要是依据以下两个公式进行,这里的r rr表示浮点实数,q qq表示量化后的定点整数:


"""
这是对tensor进行量化
:x: 输入的需量化的tensor
:scale: 量化的尺度
:zero_point: 零点
:num_bits: 量化后的bit位
:signed: 量化是有无符号
:returns: 量化之后的张量
"""
def quantize_tensor(x, scale, zero_point, num_bits=8, signed=False):
    if signed:
        qmin = - 2. ** (num_bits - 1)
        qmax = 2. ** (num_bits - 1) - 1
    else:
        qmin = 0.
        qmax = 2.**num_bits - 1.
    q_x = zero_point + x / scale      #求量化之后的值
    q_x.clamp_(qmin, qmax).round_()   #round代表了四舍五入
    return q_x                        #量化之后的值
"""
这是对tensor进行反量化
:x: 量化后的值
:scale: 量化的尺度
:zero_point: 零点
:returns: 反量化后输出的张量
"""
def dequantize_tensor(q_x, scale, zero_point):
    return scale * (q_x - zero_point)

4.3 求解最大与最小值进行量化与反量化操作

从以上公式可以知道,倘若我们要想计算尺度因子和零点进而实现数值的量化,我们需要知道数值的最大值和最小值,以及量化的比特位。所以在后训练量化过程中,需要先统计样本以及中间层的 min, max,同时也频繁涉及到一些量化,反量化操作,因此我们可以把这些功能都封装成一个 QParam类,代码如下所示:

"""
QParam  在后训练量化过程中,需要先统计样本以及中间层的 min, max,同时也频繁涉及
        到一些量化,反量化操作,因此我们可以把这些功能都封装成一个 QParam类
:num_bits: 比特
:scale: 量化的尺度
:min: 最小值
:max: 最大值
"""
class QParam:
    def __init__(self, num_bits=8):
        self.num_bits = num_bits
        self.scale = None
        self.zero_point = None
        self.min = None    #手工定义的最大值
        self.max = None    #手工定义最小值
    """
    update 函数就是用来统计 min、max
    """
    def update(self, tensor):
        if self.max is None or self.max < tensor.max():
            self.max = tensor.max()
        self.max = 0 if self.max < 0 else self.max
        if self.min is None or self.min > tensor.min():
            self.min = tensor.min()
        self.min = 0 if self.min > 0 else self.min
        #计算参数的量化尺度和零点
        self.scale, self.zero_point = calcScaleZeroPoint(self.min, self.max, self.num_bits)
    def quantize_tensor(self, tensor):
        return quantize_tensor(tensor, self.scale, self.zero_point, num_bits=self.num_bits)
    def dequantize_tensor(self, q_x):
        return dequantize_tensor(q_x, self.scale, self.zero_point)

定义的这个类就可以实现对数据的量化操作,其主要操作步骤是,首先使用update()函数去计算输入张量的最大值和最小值,并调用函数calcScaleZeroPoint()计算出尺度因子和零点(这就是公式1的具体实现过程)。接着就是对数值进行具体的量化操作,采用的函数是quantize_tensor(),这就是公式2的具体实现过程。其中QParam这个类还定义了一种用于反量化的方法,dequantize_tensor()。


要注意的是,除了第一个 conv 需要统计输入的 min、max 外,其他层都只需要统计中间输出 feature 的 min、max 即可。另外,对于 relu、maxpooling 这类激活函数来说,它们会沿用上一层输出的 min、max,不需要额外统计,即上图中会共享相同的 min、max。

相关文章
|
2天前
|
云安全 人工智能 安全
|
25天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
23天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
66 2
|
24天前
|
运维 网络协议 算法
7 层 OSI 参考模型:详解网络通信的层次结构
7 层 OSI 参考模型:详解网络通信的层次结构
50 1
|
29天前
|
监控 安全 网络安全
企业网络安全:构建高效的信息安全管理体系
企业网络安全:构建高效的信息安全管理体系
62 5
|
28天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
53 3
|
1月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
1月前
|
数据采集 存储 机器学习/深度学习
构建高效的Python网络爬虫
【10月更文挑战第25天】本文将引导你通过Python编程语言实现一个高效网络爬虫。我们将从基础的爬虫概念出发,逐步讲解如何利用Python强大的库和框架来爬取、解析网页数据,以及存储和管理这些数据。文章旨在为初学者提供一个清晰的爬虫开发路径,同时为有经验的开发者提供一些高级技巧。
24 1
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
79 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
存储 安全 网络安全

热门文章

最新文章