郓城住房和城乡建设厅网站,网站制作多少钱新闻,开发一个网站系统报价,淘宝联盟怎么建网站tensorflow qat
https://www.wpgdadatong.com/tw/blog/detail/70672
在边缘运算的重点技术之中#xff0c;除了简化复杂的模块构架#xff0c;来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架#xff08;TensorFlow、Pytorc…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的NPUNeural 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 TrainingQAT亦是一种量化手段其原理与上一小节所介绍的量化方式雷同目的也是以降低精度的方式缩小模块所需计算的数据量来提升模块运算速度且保持一定准确度的一种优化手段。相较于上一小节所介绍的训练后之量化方式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(filters12, kernel_size(3, 3), activationrelu),keras.layers.MaxPooling2D(pool_size(2, 2)),keras.layers.Flatten(),keras.layers.Dense(10)
])# Train the digit classification model
model.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])
model.fit( train_images, train_labels,epochs1, validation_split0.1, batch_size32 )感知量化模型是需要搭配原生模型与原生模型所训练的数据集。这里利用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(optimizeradam,
losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),
metrics[accuracy])q_aware_model.summary()Step 2建立感知量化模块进阶用法 进阶的感知量化训练方式就是直接利用Tensorflow Model Optimization的量化套件进行微调选择适当的构架层进行量化。 如下代码所示将利用clone_model复制原生模块baseline model并透过apply_quantization_to_dense来选择须量化的构架层而此示例仅量化Dense构架层。
def apply_quantization_to_denselayer
if isinstancelayertf.keras.layers.Dense
return tfmot.quantization.keras.quantize_annotate_layerlayer
return layer
annotated_model tf.keras.models.clone_model
base_model
clone_functionapply_quantization_to_denseqat_model tfmot.quantization.keras.quantize_applyannotated_model
qat_model.compileoptimizeradamlosstf.keras.losses.SpareCategoricalCrossentropyfrom_logitsTruemetrics[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.fittrain_images_subsettrain_labels_subsetbatch_size500epochs1validation_split0.1
q_aware_annotate_model.fittrain_images_subsettrain_labels_subsetbatch_size500epochs1validation_split0.1训练完成后即可验证模块的准确度的表现状况如下代码与结果所示Baseline test accuary为原始模块所呈现的准确度反之Quant test accuracy为感知量化的准确度而感知量化的方式略高于0.02的准确度故更好的准确度表现
_baseline_model_accuracy model.evaluate
test_imagestest_labelsverbose0
_q_aware_model_accuracy q_aware_model.evaluate
test_imagestest_labelsverbose0
_q_aware_annotate_model_accuracy q_aware_annotate_model.evaluate
test_imagestest_labelsverbose0
printBaseline test accuracy:baseline_model_accuracy
printQuant test accuracy:q_aware_model_accuracy
printQuant test accuracyannotateq_aware_annotate_model_accuracyStep 4进行转换 基本上前面步骤已经完成大致感知量化训练的操作但因为最终目标是须应用于移动装置之中。故需要于感知量化训练且生成新的模块之后利用上一小节的训练后之量化方式Post-training quantization的方式进行量化转换如下代码所示然而细心的读者应该可以发现一些小细节就是这个代码又做一次优化这里先卖个关子原因将置于结论再向读者探讨
# quantized_aware_tranning_modelDynamic
run_model tf.functionlambda x: q_aware_modelx
concrete_func run_model.get_concrete_functiontf.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”wbas f:
f.writequantized_aware_tranning_model_dynamic
print“quantized_aware_tranning_model_dynamic done”完成后会生成对应的.tflite档案即可直接应用
量化使用分析 这里以MNIST手写数字识别模块为基准将测试原生模块与感知量化训练普通用法与进阶用法所生成的模块来搭配训练后之量化等转换方式来验证准确度为何同时也测试经过训练后之量化的方式是否对于模块准确度或是应用有何影响其测试代码就如同上一章所介绍的方式或可以直接查看以及执行运行Colab代码。 实验测试数据结果 其测试准确度数据结果如下 四.结语 依目前实验结果而论感知量化训练Quantization Aware Training能够尽可能去逼近原始模块的准确度甚至还可能有些许的小幅度提升。而就推理速度来看感知量化训练的普通用法其实相当于训练后之量化的全整数量化之结果也表示模块内的参数已转换为低精度的表示方式换句话说若实现过感知量化训练的优化则不必多此一举再做一次训练后之量化的优化。但碍于硬件加速器或处理器的不同可能会出现各式各样的问题就如同上述表格中的X这就代表感知量化训练所生成的模块仍有一定机率不能顺利运行于NPU上。故重新结合训练后之量化方式来达到更加的应用体验此外读者不仿思考一下为何感知量化训练的普通用法与进阶用法所呈现的推理速度表现会有落差其实此结果是完全符合上述所向各位描述的一致也就是进阶用法仅量化了完全连接层Dense一个构架层而已自然表现就会比普通用法来得慢最后探讨一下是否推荐使用『感知量化训练』来进行优化以作者角度而言若是开发者刚好使用Keras框架来开发模块的话是个很棒的选择而事实上每个神经网络框架都有拥护者不可能所有人都用此框架开发。故对于活用度而言感知量化训练略显于不足故仍推荐先活用训练后之量化的方式进行优化