主要内容

equalizeLayers

深度神经网络层参数的均衡化

描述

例子

equalizedNet= equalizeLayers (均衡深度神经网络中的层参数并返回一个更新后的相同类型的网络。

这个函数需要深度学习工具箱模型量化库

例子

全部折叠

这个例子展示了如何通过均衡网络中的层参数来提高量化深度学习模型的性能。使用equalizeLayers函数调整计算层的兼容网络参数,以使层更适合量化。

本例中的网络具有MobileNet-v2骨干网。利用转移学习训练网络对CIFAR-10数据集中的图像进行分类。

加载预先训练的网络和数据

下载CIFAR-10数据集[1]。该数据集包含6万张图像。每张图片的尺寸是32x32,有三个颜色通道(RGB)。数据集的大小是175 MB。根据您的互联网连接,下载过程可能需要一些时间。

Datadir = tempdir;downloadCIFARData (datadir);

使用MobileNet-v2骨干网为CIFAR-10加载经过训练的网络。批归一化层被折叠成卷积层和分组卷积层。

净=负荷(“CIFARMobilenet.mat”) .trainedNet;

将CIFAR-10训练和测试图像加载为4-D数组。训练集包含50,000张图像,测试集包含10,000张图像。创建一个augmentedImageDatastore对象,用于网络训练和验证。

[XTrain,TTrain,XTest,TTest] = loadCIFARData(datadir);inputSize = net.Layers(1).InputSize;augimdsTrain = augmentedImageDatastore(inputSize,XTrain,TTrain);augimdsTest = augmentedImageDatastore(inputSize,XTest,TTest);类=类别(TTest);

根据测试数据计算训练网络的准确性。

YTest = category (net,augimdsTest);accuracyOfnet =平均值(YTest == TTest)*100;显示器(原始网络对验证数据的准确性:+ accuracyOfnet +“%”);
原始网络对验证数据的准确性:85.92%

使用deepNetworkDesigner功能:显示网络图和网络中可学习参数的总数。

deepNetworkDesigner(净)

当你量子化的时候,网络int8格式,它产生的精度为16.8%。与浮点版本的网络相比,精确度下降了近70%。

分析网络

量化过程中主要性能下降的一个可能原因是卷积层和分组卷积层的权张量的显著范围变化。要研究这种变化,可以查看第一个深度可分离卷积层的过滤器级别的层权值。

要获得更详细的视图,将权重张量绘制为跨过滤器的箱线图。

layerWeights = net.Layers(4).Weights;layerWeights =重塑(layerWeights,[9 32]);figure(Position = [0,700,600]);箱线图(layerWeights)包含(“过滤器(组)”) ylabel (“体重价值观”)标题(《原网络权值范围》

由于滤波器之间的显著范围变化,许多滤波器组在量化后无法表示int8格式。当不可表示值产生的错误在网络中传播时,不可表示的过滤器组会导致严重的网络退化。

若要查看跨不同层的直方图箱,请导入一个经过校准的dlquantizer对象放入深度网络量化器app显示了参数动态范围的直方图,以及各网络层参数张量的最小值和最大值。深度神经网络的量化详细解释这个过程。

使用equalizeLayers调整网络参数

您可以使用equalizeLayers改善网络量化行为的函数。的equalizeLayers函数可用于具有线性激活函数的网络,该线性激活函数具有正的尺度等方差特性[1]。的equalizeLayers函数尝试寻找兼容的层并修改权值以使网络更适合量化。该函数修改层权值,使网络的整体数值输出保持不变。

均衡网络中的层。

equalizedNet = equalizeLayers(net);

量化均衡网络

在你均衡层之后,量化网络。比较有均衡层和没有均衡层的量化网络的精度。

创建一个dlquantizer对象为均衡网络。

dlQuantObj = dlquantizer(equalizedNet);

定义用于量化的校准数据。

numberOfCalibrationImages = 500;augimdcalibration =子集(augimdsTrain,1:numberOfCalibrationImages);

校准dlquantizer对象。

calibStats =校准(dlQuantObj, augimdcalibration)
calibStats =158×5表优化层名称网络层名称可学的/激活MinValue MaxValue  ___________________________________ ___________________________ ________________________ ________ ________ {' Conv1_Weights’}{‘Conv1}“权重”-1.9843 - 1.5405{‘Conv1_Bias}{‘Conv1}“偏见”-5.8864 - 4.7606{‘expanded_conv_depthwise_Weights}{‘expanded_conv_depthwise}“权重”-2.1183 - 1.5631{‘expanded_conv_depthwise_Bias}{‘expanded_conv_depthwise}“偏见”-2.3202 - 4.1318{“expanded_conv_project_Weights”}{‘expanded_conv_project}“权重”-2.1404 - 1.9959{‘expanded_conv_project_Bias}{‘expanded_conv_project}“偏见”-9.1792 - 10.327{‘block_1_expand_Weights}{‘block_1_expand}“权重”-0.85797 - 1.1262{‘block_1_expand_Bias}{‘block_1_expand}“偏见”-2.2402 - 4.8886{‘block_1_depthwise_Weights}{‘block_1_depthwise}“权重”-1.5857 - 2.3307{‘block_1_depthwise_Bias}{‘block_1_depthwise}“偏见”-8.9999 - 9.0277{‘block_1_project_Weights}{‘block_1_project}“权重”-3.97022.3751 {'block_1_project_Bias'} {'block_1_project'} "Bias" -15.641 17.965 {'block_2_expand_Weights'} {'block_2_expand'} "Bias" - 0.0.41095 0.36931 {'block_2_expand_Bias'} {'block_2_expand'} "Bias" -2.1926 4.034 {'block_2_depthwise_Weights'} {'block_2_depthwise_Bias'} {'block_2_depthwise_Bias'} "Weights" -2.06 2.1283 {'block_2_depthwise_Bias'} {'block_1_project'} "Bias" -2.2893 4.5481 "

使用数字转换函数创建一个可模拟的量化网络dlquantizer对象。

qNetEqualized =量化(dlQuantObj);

评估量化网络的准确性。该表比较了原始浮点网络、没有均衡层的量化网络和有均衡层的量化网络的精度。

YTest =分类(qNetEqualized,augimdsTest);accuracyOfQuantizedNet =平均值(YTest == TTest)*100;createComparisonTable (accuracyOfnet accuracyOfQuantizedNet)
ans =1×3表原始网络量化原始网络量化平衡的网络  ________________ __________________________ ___________________________ 测试数据精度(%)85.92 16.81 76.44

将新的权重张量绘制为穿过过滤器的箱线图。均衡网络的权值范围分布较好,量化均衡网络的性能明显优于未分层均衡的量化网络。

newLayerWeights = equalizedNet.Layers(4).Weights;newLayerWeights =重塑(newLayerWeights,[9 32]);图(位置= [0,0700600]);箱线图(newLayerWeights)包含(“过滤器(组)”) ylabel (“体重价值观”)标题(《原网络权值范围》

辅助函数

createComparisonTableHelper函数打印一个表,比较原始浮点网络、没有均衡层的量化网络和有均衡层的量化网络的精度。

函数comparisonTable = createComparisonTable(originalAccuracy,accuracyQuantizedEqualizedNet)创建汇总表对比表=表(originalAccuracy,16.81,accuracyQuantizedEqualizedNet,...VariableNames = [“原始网络”“量化原创网络”“量化均衡网络”),...RowNames =“测试数据准确度(%)”);结束

输入参数

全部折叠

预训练神经网络,指定为DAGNetworkSeriesNetworkdlnetworkyolov2ObjectDetector(计算机视觉工具箱),或ssdObjectDetector(计算机视觉工具箱)对象。

输出参数

全部折叠

均衡网络,返回为DAGNetworkSeriesNetworkdlnetworkyolov2ObjectDetector,或ssdObjectDetector对象。函数返回的网络类型与输入。

参考文献

内格尔,马库斯,马特·范·巴伦,蒂吉曼·布兰卡沃特和马克斯·韦林。"通过权重均衡和偏差修正的无数据量化"在2019年IEEE/CVF计算机视觉国际会议1325 - 34。韩国首尔(韩国):IEEE, 2019。https://doi.ogg/10.1109/ICCV.2019.00141。

版本历史

在R2022b中引入

Baidu
map