tensorflow QAT
tensorflow qat
https://www.wpgdadatong.com/tw/blog/detail/70672
在边缘运算的重点技术之中,除了简化复杂的模块构架,来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架(TensorFlow、Pytorch etc…)的模块优化能力,主要探讨TensorFlow Lite的训练后之量化方式(Post-training quantization)与感知量化训练(Quantization-aware Training),依序分为上与下两篇幅,本篇将介绍后者信息为主。所谓的量化就是将以最小精度的方式,来进行模块推理,使模块应用至各种Edge Device之中,并达到足够成本效益,如下图所示。顺带一提,恩智浦NXP i.MX8M Plus的NPU(Neural Processing Unit)神经处理单元,属于纯整数的AI加速器,就仅适用于8位的整数运算才能获得最佳效益!!此系列的后续章节,也会利用NPU来实现算法加速之目的。
利用TensorFlow Lite量化方式所构成的模块,就是将训练完成的轻量化模块,透过量化与优化的方式来提升推理速度!!如下模型运作概念图所示,储存模型完成后,即可依序执行冻结模型、优化模型到最后轻量化模型(.tflite),让模型运行在移动式装置时可达到最佳化的效果。
※MobileNet模块是一种轻量化模块的构架,而此篇重点是如何透过模块量化转换为轻量化模块(tflite)
何谓量化?在此文章是泛指数值程度上的量化,亦指有限范围的数值表示方式。其作用是为了降低数值数据量与模块大小,来提升传输与执行(推理)速度!!而所谓的训练后之量化(Post-training quantization)就是利用训练完成的模块,再次进行量化的一种优化方式。主要特色就是仅须要储存后的模块(SaveModel / .h5 /ckpt),且不需要训练时的数据库即可量化。
举例来说,如下图所示,是须将原本数值分布为-3e38到+3e38的浮点数型态float,量化为数值分布-231到231的整数型态int,并以原本数据的最大值与最小值来找出有效的数值范围,将有一定概率大幅度减少数据量。
量化优势?劣势?对于TensorFlow Lite轻量化的应用而言
优势:
-减少模块尺寸:最多能缩减75%的大小
-加快推理速度:使用整数计算大幅度提升速度
-支持硬件较佳:能使处理八位元的处理器进行推理
-传输速度提升:因模块尺寸缩小,能更获得更好的传输质量
缺点:
-精度损失:因为数值的表示范围缩减,故模块的准确度将会大幅度的降低
三.感知量化训练(Quantization-aware Training)
感知量化训练(Quantization-aware Training,QAT)亦是一种量化手段,其原理与上一小节所介绍的量化方式雷同,目的也是以降低精度的方式,缩小模块所需计算的数据量,来提升模块运算速度,且保持一定准确度的一种优化手段。相较于上一小节所介绍的训练后之量化方式(Post-training quantization)最大的不同,就是需要利用原生模块与训练集(DataSets)来作重新训练,而感知量化训练会于训练时,去模拟低精度的运算,来保持最佳的模块准确度。
故理论上,『感知量化训练量化』的准确度会来得比『训练后之量化方式』来的准确,如下图所示;感知量化训练的模块(QAT Model)准确度能够逼近于原生模块(Baseline Model),反之,训练后之量化方式(Post-Training full quantized Model)则降低了约莫0.05的准确度。但其实该量化方式存在比较多不稳定因素,像是各机器学习框架的转换、版本不匹配、缺乏正确训练数据集或是不能微调等等因素,故官方比较推荐使用『感知量化训练量化』来获得更稳定的量化体验。
使用方式 :
大致上 Quantization Aware Training 的應用核心 可以分為四個步驟,分別為建立原生模組、建立感知量化模組、進行感知量化訓練、進行轉換等步驟。
必要套件 :
$ pip install -q tensorflow
$ pip install -q tensorflow-model-optimization
Step 1:建立原生模块
im
port tempfile
import os
import tensorflow as tf
from tensorflow import keras# Load MNIST dataset
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0# Define the model architecture.
model = keras.Sequential([keras.layers.InputLayer(input_shape=(28, 28)),keras.layers.Reshape(target_shape=(28, 28, 1)),keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation='relu'),keras.layers.MaxPooling2D(pool_size=(2, 2)),keras.layers.Flatten(),keras.layers.Dense(10)
])# Train the digit classification model
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
model.fit( train_images, train_labels,epochs=1, validation_split=0.1, batch_size=32 )
感知量化模型是需要搭配原生模型与原生模型所训练的数据集。这里利用MNIST手写识别的示例来进行演示,如下代码所示;包含模块构架建立,以及利用MNIST DataSets进行训练。
其原生模块构架,如下图所示。
Step 2:建立感知量化模块(普通用法)
最简单的感知量化训练方式,就是直接利用Tensorflow Model Optimization的量化套件进行应用。
如同下代码与结果所示,将原生模块代入至quantize_model量化套件中,即构成感知量化的模块构架;若仔细观察的话,则会发现构架层的名称皆冠上quant的字眼,也就是程序会去模拟低精度的运算,亦可称Fake Quantization。
import tensorflow_model_optimization as tfmot
quantize_model = tfmot.quantization.keras.quantize_model
# q_aware stands for for quantization aware.
q_aware_model = quantize_model(model)
q_aware_model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])q_aware_model.summary()
Step 2:建立感知量化模块(进阶用法)
进阶的感知量化训练方式,就是直接利用Tensorflow Model Optimization的量化套件进行微调,选择适当的构架层进行量化。
如下代码所示,将利用clone_model复制原生模块(baseline model)并透过apply_quantization_to_dense来选择须量化的构架层,而此示例仅量化Dense构架层。
def apply_quantization_to_dense(layer):
if isinstance(layer,tf.keras.layers.Dense):
return tfmot.quantization.keras.quantize_annotate_layer(layer)
return layer
annotated_model = tf.keras.models.clone_model(
base_model,
clone_function=apply_quantization_to_dense,
)
qat_model = tfmot.quantization.keras.quantize_apply(annotated_model)
qat_model.compile(optimizer='adam',loss=tf.keras.losses.SpareCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
其感知量化模块构架,如下图所示,请读者仔细观察与普通用法的不同,就能够发现前面几构架层,以无quant的字眼,表示这是原生的构架层。
若欲理解更多进阶用法,可以参考官方示例以及查看可量化的构架层(请搜寻Default8BitQuantizeRegistry的字眼,查阅所描述的构架层),同理,若欲尝试量化没有支持的构架层,可以透过QuantizeConfig方式进行量化,可以参考Medium网志的解说!!
Step 3:进行感知量化训练
接着,需要对感知量化模块(q_ware_model)再次进行训练,得以模拟低精度运算,如下代码所示。
train_images_subset = train_images[0:1000]
train_labels_subset = train_labels[0:1000]
q_aware_model.fit(train_images_subset,train_labels_subset,batch_size=500,epochs=1,validation_split=0.1)
q_aware_annotate_model.fit(train_images_subset,train_labels_subset,batch_size=500,epochs=1,validation_split=0.1)
训练完成后,即可验证模块的准确度的表现状况,如下代码与结果所示;Baseline test accuary为原始模块所呈现的准确度,反之Quant test accuracy为感知量化的准确度!!而感知量化的方式略高于0.02的准确度,故更好的准确度表现!!
_,baseline_model_accuracy = model.evaluate(
test_images,test_labels,verbose=0)
_,q_aware_model_accuracy = q_aware_model.evaluate(
test_images,test_labels,verbose=0)
_,q_aware_annotate_model_accuracy = q_aware_annotate_model.evaluate(
test_images,test_labels,verbose=0)
print('Baseline test accuracy:',baseline_model_accuracy)
print('Quant test accuracy:',q_aware_model_accuracy)
print('Quant test accuracy(annotate):',q_aware_annotate_model_accuracy)
Step 4:进行转换
基本上,前面步骤已经完成大致感知量化训练的操作,但因为最终目标是须应用于移动装置之中。故需要于感知量化训练且生成新的模块之后,利用上一小节的训练后之量化方式(Post-training quantization)的方式进行量化转换,如下代码所示!!然而,细心的读者应该可以发现一些小细节,就是这个代码又做一次优化,这里先卖个关子,原因将置于结论再向读者探讨!!
# quantized_aware_tranning_model(Dynamic)
run_model = tf.function(lambda x: q_aware_model(x))
concrete_func = run_model.get_concrete_function(tf.TensorSpec([1,28,28],model.inputs[0].dtype))
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_aware_tranning_model_dynamic = converter.convert()
with open(“quantized_aware_tranning_model_dynamic.tflite”,'wb')as f:
f.write(quantized_aware_tranning_model_dynamic)
print(“quantized_aware_tranning_model_dynamic done!!”)
完成后,会生成对应的.tflite档案,即可直接应用!!
量化使用分析:
这里以MNIST手写数字识别模块为基准,将测试原生模块与感知量化训练(普通用法与进阶用法)所生成的模块,来搭配训练后之量化等转换方式来验证准确度为何!!同时,也测试经过训练后之量化的方式,是否对于模块准确度或是应用有何影响?其测试代码就如同上一章所介绍的方式,或可以直接查看以及执行运行Colab代码。
实验测试数据结果:
其测试准确度数据结果如下:
四.结语
依目前实验结果而论,感知量化训练(Quantization Aware Training)能够尽可能去逼近原始模块的准确度,甚至还可能有些许的小幅度提升。而就推理速度来看,感知量化训练的普通用法其实相当于训练后之量化的全整数量化之结果,也表示模块内的参数已转换为低精度的表示方式!!换句话说,若实现过感知量化训练的优化则不必多此一举再做一次训练后之量化的优化。但碍于硬件加速器或处理器的不同,可能会出现各式各样的问题,就如同上述表格中的X,这就代表感知量化训练所生成的模块,仍有一定机率不能顺利运行于NPU上。故重新结合训练后之量化方式来达到更加的应用体验!!此外,读者不仿思考一下,为何感知量化训练的普通用法与进阶用法,所呈现的推理速度表现会有落差?其实此结果是完全符合,上述所向各位描述的一致,也就是进阶用法仅量化了完全连接层(Dense)一个构架层而已,自然表现就会比普通用法来得慢!!最后,探讨一下是否推荐使用『感知量化训练』来进行优化?以作者角度而言,若是开发者刚好使用Keras框架来开发模块的话,是个很棒的选择!!而事实上,每个神经网络框架都有拥护者,不可能所有人都用此框架开发。故对于活用度而言,感知量化训练略显于不足,故仍推荐先活用训练后之量化的方式进行优化!
相关文章:
tensorflow QAT
tensorflow qat https://www.wpgdadatong.com/tw/blog/detail/70672 在边缘运算的重点技术之中,除了简化复杂的模块构架,来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架(TensorFlow、Pytorc…...
[杂谈]-快速了解LoRaWAN网络以及工作原理
快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备(End Devices)1.2 网关(Gateways)1.3 网络服务器(Net Server)1.4 应用服务器(Appli…...
MySQL--MySQL表的增删改查(基础)
排序:ORDER BY 语法: – ASC 为升序(从小到大) – DESC 为降序(从大到小) – 默认为 ASC SELECT … FROM table_name [WHERE …] ORDER BY column [ASC|DESC], […]; *** update...
Vue中启动提示polyfill缺少-webpack v5版本导致
安装 npm i node-polyfill-webpack-plugin 因为我们的项目使用webpack v5,其中polyfill Node核心模块被删除。所以,我们安装它是为了在项目中访问这些模块 vue.config.js文件 const { defineConfig } require("vue/cli-service"); const No…...
Hugging Face实战-系列教程3:AutoModelForSequenceClassification文本2分类
🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在notebook中进行 本篇文章配套的代码资源已经上传 下篇内容: Hugging Face实战-系列教程4:padding与attention_mask 输出我…...
《TCP/IP网络编程》阅读笔记--Socket类型及协议设置
目录 1--协议的定义 2--Socket的创建 2-1--协议族(Protocol Family) 2-2--Socket类型(Type) 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…...
GitHub使用教程
GitHub使用教程 视频教程一:Github 新手够用指南 | 全程演示&个人找项目技巧放送_哔哩哔哩_bilibili 笔记: README.md编写教程:Typora官方免费版与入门教程__阿伟_的博客-CSDN博客 找开源项目的一些途径 • https://github.com/trendin…...
sql server 分区表
分区表 分区表是在SQL Server 2005之后的版本引入的特性,这个特性允许把逻辑上的一个表在物理上分为很多部分。换句话说,分区表从物理上看是将一个大表分成几个小表,但是从逻辑上看,还是一个大表。 步骤 创建分表区的步骤分为…...
开源许可证概述:GNU, BSD, Apache, MPL, 和 MIT
前言 开源许可证是开源软件分发的基础。它们定义了使用者如何使用,修改,分发开源软件。在这篇文章中,我们将探讨五种常见的开源许可证:GNU通用公共许可证 (GNU GPL),BSD许可证,Apache许可证,Mo…...
java中log使用总结
目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3…...
【Java】传输层协议TCP
传输层协议TCP TCP报文格式首部长度保留位32位序列号和32位确认应答号标记ACKSYNFINRSTURGPSH 16位窗口大小16位校验和16位紧急指针选项 TCP特点可靠传输实现机制-确认应答超时重传连接管理机制三次握手四次挥手特殊情况 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘…...
计算机网络基础知识(非常详细)
1. 网络模型 1.1 OSI 七层参考模型 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联,是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。 它是一个七层的、抽象的模型体ÿ…...
如何进行SEO优化数据分析?(掌握正确的数据分析方法,让您的网站更上一层楼!)
在互联网时代,SEO优化已经成为了每一个网站运营者必备的技能。而在SEO优化中,数据分析更是至关重要的一环。在本文中,我们将会详细介绍如何正确的进行SEO优化数据分析,让您的网站更上一层楼! 数据分析的重要性 数据分…...
Golang不同平台编译的思考
GOOS和GOARCH $GOOS可选值如下: darwin dragonfly freebsd linux netbsd openbsd plan9 solaris windows $GOARCH可选值如下 386 amd64 arm 在编译的时候我们可以根据实际需要对这两个参数进行组合。更详细的说明可以进官网看看 ## http://golang.org/cmd/go http…...
SpringSecurity学习
1.认证 密码校验用户 密码加密存储 Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}} 我们没有这个配置,默认明文存储, {id}password;实现…...
时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测
时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测 目录 时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 ICEEMDAN-iMPA-BiLSTM功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法双向长短期记忆…...
二叉树(上)
“路虽远,行则将至” ❤️主页:小赛毛 目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示(树的存储) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树 2.3 特殊的二叉树: 2.4 二叉树的性质 3.二叉树的顺…...
Excel怎么批量生成文件夹
Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html...
c++ 学习之 静态成员变量和静态成员函数
文章目录 前言正文静态成员变量初始化操作如何理解共享一份数据访问权限 静态成员函数访问方式静态成员函数只能访问静态成员变量访问权限 前言 静态成员分为 1)静态成员变量 所有对象共享一份数据在编译阶段分配空间类内声明,类外初始化 2)…...
C程序需要按下回车键才能读取字符
当编写涉及从终端输入字符的C程序时,有时会遇到需要按下回车键才能读取字符的问题。这是因为默认情况下,终端通常处于行缓冲模式,需要等待用户按下回车键才会将输入的字符发送给正在运行的程序。这可能会导致一些不便,尤其是当程序…...
x86体系结构(WinDbg学习笔记)
寄存器 eaxAccumulator累加器ebxBase register基寄存器ecxCounter register计数器寄存器edxData register - can be used for I/O port access and arithmetic functions数据寄存器-可用于I/O端口访问和算术函数esiSource index register源索引寄存器ediDestination index reg…...
Hadoop的第二个核心组件:MapReduce框架第四节
Hadoop的第二个核心组件:MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程:详细的工作流程第一步:提交MR作业资源第二步:运行M…...
算法通关村第十九关——最少硬币数
LeetCode322.给你一个整数数组 coins,表示不同面额的硬币,以及一个整数 amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。 示例1&…...
Linux ifconfig只显示 lo 网卡,没有ens网卡解决方案
项目场景: 虚拟机中linux无网络问题 问题描述 之前在调试linux的时候,由于一些不太清楚的误操作,导致ubuntu linux出现无网络问题,现象如下 ifconfig 只显示了 lo 网卡 lo 网卡:它是本地环回接口。 这意味着您的虚…...
Java复习-26-枚举
枚举(替换多例设计) 目的(使用场景) 不用也没啥 定义一个描述性别的类,那么该对象只有两个:男、 女。或者描述颜色基色的类,可以使用: 红色、绿色、蓝色。 功能 用于定义有限个数对象的一种结构&#x…...
NLP(六十八)使用Optimum进行模型量化
本文将会介绍如何使用HuggingFace的Optimum,来对微调后的BERT模型进行量化(Quantization)。 在文章NLP(六十七)BERT模型训练后动态量化(PTDQ)中,我们使用PyTorch自带的PTDQ&…...
Tomcat多实例和负载均衡动静分离
目录 一、Tomcat多实例部署 二、负载均衡动静分离 2.1.动静分离 2.11 nginx负载均衡 192.168.30.203 2.22 Tomcat服务器:192.168.30.200:80 2.23 Tomcat服务器:192.168.30.100:80 2.24 配置nginx 192.168.30.203静态页面 2…...
企业ERP和泛微OA集成场景分析
轻易云数据集成平台(qeasy.cloud)为企业ERP和泛微OA系统提供了强大的互通解决方案,特别在销售、采购和库存领域的单据审批场景中表现出色。这些场景涉及到多个业务单据的创建和审批,以下是一些具体的应用场景描述: 采购…...
31 WEB漏洞-文件操作之文件包含漏洞全解
目录 文件包含漏洞原理检测类型利用修复 本地包含-无限制,有限制远程包含-无限制,有限制各种协议流玩法文章介绍读取文件源码用法执行php代码用法写入一句话木马用法每个脚本支持的协议玩法 演示案例某CMS程序文件包含利用-黑盒CTF-南邮大,i春…...
qmake.exe xxx.pro -spec win32-g++ 作用
作用 qmake.exe xxx.pro -spec win32-g的作用是使用win32-g构建系统规范来生成针对xxx.pro项目的构建脚本。 具体来说,这个命令的含义如下: qmake.exe:使用qmake命令行工具。xxx.pro:指定了要构建的项目文件,.pro文…...
浙浙江省建设信息港/seo关键词如何布局
2019独角兽企业重金招聘Python工程师标准>>> 我对一个String对象调用replaceAll(".","/") 本意是想将路径转换为URI格式,没想到调错了,导致整个String变成了// 后来才发现是应该调用replace(.,/) 前面那个方法按照正则解析的,我晕 转载于:https…...
合肥做公司网站一般多少钱/网页设计代码大全
中断由外部设备产生,异常由CPU内部产生(异常包括错误Fault, 陷阱Trap即故意出错,和终止Abort)。中断要找到中断服务程序所以需要IDT这个大数组来存放中断门(中断门就是一种段描述符,用于找到中断程序入口地…...
有哪些ui的设计网站/谈谈你对网络营销的看法
目录一、算法思维导图二、算法分类三、冒泡排序1、基本思想2、动态效果图3、代码实现4、速度测试四、选择排序1、基本思想2、动态效果图3、代码实现4、速度测试五、插入排序1、基本思想2、动态效果图3、代码实现4、速度测试六、希尔排序1、基本思想2、效果图3、代码实例七、快速…...
大连 模板网站/百度小说排行榜2020
一、Mosaic data augmentation Mosaic数据增强方法是YOLOV4论文中提出来的,主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。 这样做有以下几个优点: 1、增加了数据的多样性,丰富了图片的背景。 2、增加了目标个…...
福田附近做网站公司/北京seo课程培训
2019独角兽企业重金招聘Python工程师标准>>> 最近看了一个Google日本的企宣视频, 感觉超级好玩. 真是叹服Google日本的奇思妙想. 于是驱猫寻图, 找到了Google存放图片的地址. 然后编写了一个超级简单的脚本重现了该tabplay(前提是chrome为默认浏览器). 真是华丽... …...
给银行做网站/百度竞价一个月5000够吗
* 1,报表与子报表的参数传递, 例如 page3包括了子报表page3_1,page3_1包括了子报表page3_1_1, 则在page3的subreport parameters 里面应该刚添加参数page3_1_1,这是page3_1需要的 那page_main包含了page3,p…...