【模型】模型量化技术:动态范围、全整数和Float16量化

目录

一 动态范围量化

二 全整数量化

三 float16量化


通常,表示神经网络的数据类型是32位浮点数(float32),这种数据类型可以提供高精度的计算,但是在计算资源和存储空间有限的设备上运行神经网络时,会带来一定的挑战,因此可以对模型进行量化处理。Int8量化是一种将神经网络权重和激活值转换为8位整数(int8)表示的技术。TensorFlow Lite转换器将已训练的浮点 TensorFlow 模型转换为 TensorFlow Lite 格式后,可以完成对这个模型的量化。

查看网络结构:netron 

技术有动态范围全整数Float16量化三种。

一 动态范围量化

训练后量化最简单的形式是仅将权重从浮点静态量化为整数(具有8位精度),推断时,权重从8位精度转换为浮点,并使用浮点内核进行计算。此转换会完成一次并缓存,以减少延迟。

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = [tf.lite.Optimize.DEFAULT]tflite_quant_model = converter.convert()

使用动态范围算子的加速小于全定点计算

二 全整数量化

通过确保所有模型数学均为整数量化,进一步改善延迟,减少峰值内存用量,以及兼容仅支持整数的硬件设备或加速器。使用默认浮点输入/输出仅整数输入和输出在内的所有算子强制执行全整数量化的实践如下:

①  ResNet50_fp32.tflite模型

  • 代码
import tensorflow as tf
model = tf.keras.applications.ResNet50(weights='imagenet')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
# 执行模型转换
tflite_model = converter.convert()
# 将转换后的模型保存为.tflite文件
with open("ResNet50_fp32.tflite", 'wb') as f:f.write(tflite_model)pass
  • 查看模型结构等信息

使用默认浮点输入/输出

ResNet50_in8.tflite模型。为了与原始的全浮点模型具有相同的接口,此 tflite_quant_model 不兼容仅支持整数的设备和加速器,因为输入和输出仍为浮点

  • 代码
import tensorflow as tf
import numpy as np
# 出于测试目的,可以使用如下所示的虚拟数据集
def representative_dataset():for _ in range(100):data = np.random.rand(1, 224, 224, 3)yield [data.astype(np.float32)]model = tf.keras.applications.ResNet50(weights='imagenet')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
# 执行模型转换
tflite_model = converter.convert()
# 将转换后的模型保存为.tflite文件
with open('ResNet50_in8.tflite', 'wb') as f:f.write(tflite_model)
pass
  • 查看模型结构等信息

③ 仅整数

ResNet50_in8_all.tflite模型,输入和输出在内的所有算子强制执行全整数量化。

  • 代码
import tensorflow as tf
import numpy as np
# 出于测试目的,可以使用如下所示的虚拟数据集
def representative_dataset():for _ in range(100):data = np.random.rand(1, 224, 224, 3)yield [data.astype(np.float32)]model = tf.keras.applications.ResNet50(weights='imagenet')
# 输入和输出在内的所有算子强制执行全整数量化
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.representative_dataset = representative_dataset
# 执行模型转换
tflite_model = converter.convert()
# 将转换后的模型保存为.tflite文件
with open('ResNet50_in8_all.tflite', 'wb') as f:f.write(tflite_model)
pass
  • 查看模型结构等信息

④ MobileNet_fp32.tflite模型

  • 代码
import tensorflow as tf
model = tf.keras.applications.MobileNet(weights='imagenet')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
# 执行模型转换
tflite_model = converter.convert()
# 将转换后的模型保存为.tflite文件
with open("MobileNet_fp32.tflite", 'wb') as f:f.write(tflite_model)pass
  • 查看模型结构等信息

⑤  仅整数(MobileNet_in8.tflite模型)

  • 代码
import tensorflow as tf
import numpy as np
# 出于测试目的,可以使用如下所示的虚拟数据集
def representative_dataset():for _ in range(100):data = np.random.rand(1, 224, 224, 3)yield [data.astype(np.float32)]model = tf.keras.applications.MobileNet(weights='imagenet')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.representative_dataset = representative_dataset
# 执行模型转换
tflite_model = converter.convert()
# 将转换后的模型保存为.tflite文件
with open("MobileNet_int8_all.tflite", 'wb') as f:f.write(tflite_model)pass
  • 查看模型结构等信息

三 float16量化

可以通过将权重量化为 float16(16位浮点数的IEEE标准)来缩减浮点模型的大小。如果需要使用权重的float16量化,可以使用以下步骤:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.optimizations = [tf.lite.Optimize.DEFAULT]converter.target_spec.supported_types = [tf.float16]tflite_quant_model = converter.convert()

float16 量化的优点包括:

  1. 将模型的大小缩减一半,模型更小了;
  2. 实现最小的准确率损失;
  3. 支持可直接对 float16数据进行运算的部分委托,从而使执行速度比float32计算更快。

float16 量化的缺点包括:

  1. 延迟比对定点数学进行量化多;
  2. 通常,float16 量化模型在CPU上运行时会将权重值“反量化”为 float32。
  3. 注意:GPU 委托不会执行此反量化,因为它可以对 float16 数据进行运算。

具有 8 位权重的 16 位激活(实验性)与“仅整数”方案类似,根据激活的范围将其量化为16位,权重会被量化为8位整数。这种量化的优点是可以显著提高准确率,相比于全整数量化,会增加模型的大小。由于缺少优化的内核实现,目前的推断速度明显比8位全整数慢。目前它不兼容现有的硬件加速TFLite 委托。

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.representative_dataset = representative_datasetconverter.optimizations = [tf.lite.Optimize.DEFAULT]converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]tflite_quant_model = converter.convert()

如果模型中的部分算子不支持这一量化,模型仍然可以进行量化处理。但是,不受支持的算子会保留为浮点。要允许这一操作,将以下这个选项添加到 target_spec 中即可。

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)converter.representative_dataset = representative_datasetconverter.optimizations = [tf.lite.Optimize.DEFAULT]converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,tf.lite.OpsSet.TFLITE_BUILTINS]tflite_quant_model = converter.convert()

量化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 异步编程浅谈

1. 需求背景 当我们需要提高系统的并发性能时,我们可以将耗时的操作异步执行,从而避免线程阻塞,提高系统的并发性能。例如,在处理大量的并发请求时,如果每个请求都是同步阻塞的方式处 理,系统的响应时间会…

Git使用教程 gittutorial

该教程对该文章的翻译:https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先, 可以使用以下指令获取文档帮助 git help log笔者注:不建议看这个文档,标准的语法介绍…

FreeRTOS的学习

1.创建函数和删除 动态创建为FreeRTOS分配的堆栈(方便),而静态创建为人为分配空间。动态应用多任务中必须有while(1)否则只会执行一次任务中的延时要用 vTaskDelay(500); 延时期间执行其它任务 任务中的延时使…

postman进阶使用

前言 对于postman的基础其实很容易上手实现,也有很多教程。 对于小编我来说,也基本可以实现开发任务。 但是今年我们的高级测试,搞了一下postman,省去很多工作,让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

01-Spring Security框架的认证和授权测试

Spring Security 介绍 认证功能与业务无关几乎是每个项目都要具备的功能,市面上有很多认证框架如Apache Shiro、CAS、Spring Security等 Spring Security是Spring家族的一份子且和Spring Cloud集成的很好,所以本项目采用Spring Security作为认证服务的技术框架 …

vue3(六)-基础入门之自定义组件与插槽、ref通信

一、全局组件 html: <div id"app"><mytemplace></mytemplace> </div>javascript: <script>const { createApp } Vueconst app createApp({})app.component(mytemplace, {template: <div><button>返回</button>…

canvas随机绘制100个五角星

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

element-plus修改主题颜色

一、自定义scss文件 在src\css\styles\element目录下新建index.scss 代码如下 forward "element-plus/theme-chalk/src/common/var.scss" with ($colors: ("primary": ("base": #d61b1a,"color": #fff,),) );use "element-plus…

Java - 工厂设计模式

Java - 工厂设计模式 一. 简介二. 例子2.1 定义抽象类2.2 定义子类2.3 创建工厂2.4 测试 三. JDK中使用工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 工厂设计模式…

Day73力扣打卡

打卡记录 统计移除递增子数组的数目 II&#xff08;双指针&#xff09; 链接 class Solution:def incremovableSubarrayCount(self, a: List[int]) -> int:n len(a)i 0while i < n - 1 and a[i] < a[i 1]:i 1if i n - 1: # 每个非空子数组都可以移除return n …

普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

简介 搭建一个用于驱动 STM32F103ZET6 GPIO点亮LED灯的任务;电路原理图 LED电路原理图 芯片引脚连接LED驱动引脚原理图 创建一个点亮LED灯的Keil 5项目 创建STM32CubeMX项目 New Project -> 单击 -> 芯片搜索STM32F103ZET6->双击创建 初始化时钟 调试设置 一…

双侧电源系统距离保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 系统原始数据 双侧电源系统模型如图所示&#xff1a; 仿真模型搭建 将线路AB分成Line1和Line2&#xff0c;将线路BC分成Line3和Line4&#xff0c;用三相电压电流测量模块作为系统母线&#xff0c;根据系统已…

洛谷 P1387 最大正方形 刷题笔记

P1387 最大正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 找出一个 由数字1组成的最大正方形 输出该正方形的边长 &#xff1b; 思路 dp 画图模拟 可以发现 当 当前点a[i][j]1,满足构成正方形的初步条件 而当前点能构成的最大正方形长度 由它的左上角 左边和上边…

新手为什么跟着大型机构交易?fpmarkets总结理由

正所谓方向不对努力白费&#xff0c;这也就是为什么fpmarkets建议新手在刚开始的时候&#xff0c;跟着大型机构进行交易。 这些大型机构包括中央银行、巨额对冲基金、投资和保险公司等等&#xff0c;首先fpmarkets认为这些大型机构的交易量巨大&#xff0c;能够影响市场的走势。…

LeetCode刷题--- N 皇后

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归…

ARCGIS PRO SDK 要素空间关系

一、要素与要素查询&#xff0c;返回的是bool值 1、 Touches 判断几何要素是否接触 Touches 如果 geometry1 与 geometry2 接触&#xff0c;则返回 true&#xff0c;否则 false。 touches GeometryEngine.Instance.Touches(Geometry1, Geometry2) 2、…

传感器原理与应用复习--电感式传感器

文章目录 上一篇自感式电感传感器差动变压器式传感器电涡流式传感器下一篇 上一篇 传感器原理与应用–传感器基本特性与应变式传感器 自感式电感传感器 将线圈通入电流产生磁场&#xff0c;而间隙的大小将影响磁场的大小&#xff0c;从而进行检测 变气隙式电感传感器&#xf…

2D transform 1-translate

移位&#xff1a;translate 缩放&#xff1a;scale 旋转&#xff1a;rotate 扭曲&#xff1a;skew <style>.outer {width: 200px;height: 200px;border: 2px solid black;margin-top: 100px;}.inner {width: 200px;height: 200px;background-color: pink;transform: t…

el-select多选修改默认显示一个

需求&#xff1a;超出选择框已数字展示 效果 备忘一下 代码 父组件 <template><div><div class"credit_box"><div class"credit_select_box"><div class"credit_select"><span>选择框1</span><…

C#中的Attribute详解(上)

C#中的Attribute详解&#xff08;上&#xff09; 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute&#xff0c;为了区分这四类静态方法&#xff0c;我们只能通过注释来说明&#xff0c;但这样做会给系统带来很多…