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

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 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。

相关文章
|
28天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
102 1
|
1月前
|
监控 安全 BI
什么是零信任模型?如何实施以保证网络安全?
随着数字化转型,网络边界不断变化,组织需采用新的安全方法。零信任基于“永不信任,永远验证”原则,强调无论内外部,任何用户、设备或网络都不可信任。该模型包括微分段、多因素身份验证、单点登录、最小特权原则、持续监控和审核用户活动、监控设备等核心准则,以实现强大的网络安全态势。
131 2
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
【由浅到深】从神经网络原理、Transformer模型演进、到代码工程实现
阅读这个文章可能的收获:理解AI、看懂模型和代码、能够自己搭建模型用于实际任务。
169 11
|
1月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
90 3
|
2月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
135 2
|
2月前
|
运维 网络协议 算法
7 层 OSI 参考模型:详解网络通信的层次结构
7 层 OSI 参考模型:详解网络通信的层次结构
443 1
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
75 3
|
2月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
72 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。

热门文章

最新文章