主要内容

深层网络量化器

将深度神经网络量化为8位比例整数数据类型

描述

使用深层网络量化器通过将卷积层的权重、偏差和激活量化为8位缩放整数数据类型,减少深度神经网络的内存需求。使用此应用程序,您可以:

  • 在深层神经网络中可视化卷积层的动态范围。

  • 选择要量化的各个网络层。

  • 评估量化网络的性能。

  • 生成GPU代码以使用GPU编码器部署量化网络™.

  • 生成HDL代码,使用深度学习HDL工具箱将量化网络部署到FPGA™.

  • 生成C++代码,将量化网络部署到ARM CORTEXS微控制器上MATLAB®编码员™

深度学习工具箱™ 模型量化库支持包是一个免费的附加组件,您可以使用附加组件资源管理器下载。或者,请参见金宝app深度学习工具箱模型量化库.要了解将深度学习网络量化并部署到GPU下载188bet金宝搏、FPGA或CPU环境所需的产品,请参见量化工作流先决条件

打开深度网络量化器应用程序

  • MATLAB命令提示:输入深度网络量化器

  • MATLAB工具条:在应用程序选项卡,在下面机器学习与深度学习,单击应用程序图标。

例子

全部展开

要探索具有量化卷积层的神经网络的行为,请使用深层网络量化器应用程序。这个例子量化了可学习的卷积层的参数squeezenet神经网络经过再训练后,对新的图像进行分类训练深度学习网络对新图像进行分类实例

此示例使用带有GPU执行环境的DAG网络。

加载网络以量化到基本工作空间中。

负载
net = DAGNetwork with properties: Layers: [68×1 net.cnn.layer. layer] Connections: [75×2 table] InputNames: {'data'} OutputNames: {'new_classoutput'}

定义校准和验证数据。

应用程序使用校准数据来运行网络,并收集网络卷积层和完全连接层中权重和偏差的动态范围,以及网络所有层中激活的动态范围。为了获得最佳量化结果,校准数据必须代表网络的输入。

应用程序使用量化后的验证数据对网络进行测试,了解网络中卷积层量化可学习参数的有限范围和精度的影响。

在本例中,使用MerchData数据集。定义一个augmentedImageDatastore对象以调整网络数据的大小。然后,将数据分解为校准和验证数据集。

解压缩(“MerchData.zip”); imds=图像数据存储(“水星”,...“包含子文件夹”符合事实的...“标签源”,“foldernames”);[calData,valData]=splitEachLabel(imds,0.7,“随机化”);aug_calData = augmentedImageDatastore([227 227], calData);aug_valData = augmentedImageDatastore([227 227], valData);

在MATLAB命令提示下,打开应用程序。

深度网络量化器

在应用程序中,单击刚出现的选择量化网络

应用程序验证您的执行环境。有关更多信息,请参见量化工作流先决条件

在对话框中,从基本工作区中选择要量化的执行环境和网络。例如,选择GPU执行环境和DAG网络,

应用程序显示所选网络的图层图。

校准工具条的一部分,在校准数据,选择augmentedImageDatastore包含校准数据的基本工作区中的对象,calData

点击校准

这个深层网络量化器使用校准数据练习网络,并收集网络层中可学习参数的范围信息。

校准完成后,app会显示一个表格,其中包含了网络卷积层和全连接层的权重和偏差,以及校准过程中网络各层激活的动态范围及其最小值和最大值。在表格的右侧,应用程序显示了参数的动态范围的直方图。直方图的灰色区域表示量化表示无法表示的数据。有关如何解释这些直方图的更多信息,请参见深度神经网络的量化

量化列,指示是否量化层中的可学习参数。非卷积层的层无法量化,因此无法选择。未量化的层在量化后保持单精度。

验证工具条的一部分,在验证数据,选择augmentedImageDatastore对象从包含验证数据的基本工作空间,aug_valData

验证工具条的一部分,在量化选项,选择违约度量函数。

点击量化和验证

这个深层网络量化器将网络中卷积层的权重、激活和偏差量化为按比例缩放的8位整数数据类型,并使用验证数据来运行网络。应用程序根据正在量化的网络类型确定用于验证的默认度量函数。对于分类网络,应用程序使用Top-1 Ac策展。

验证完成后,应用程序将显示验证结果,包括:

  • 用于验证的度量函数

  • 量化前后度量函数的结果

  • 量化前后网络的内存需求(MB)

如果要使用其他度量函数进行验证,例如使用Top-5精度度量函数而不是默认的Top-1精度度量函数,则可以定义自定义度量函数。将此函数保存在本地文件中。

作用hComputeModelAccuracy = hComputeModelAccuracy(predictionScores, net, dataStore)%%计算模型级精度统计负载地面真实值tmp=readall(数据存储);groundTruth=tmp.response;%将预测标签与实际地面真实值进行比较predictionError={};对于idx=1:numel(groundTruth)[~,idy]=max(predictionScores(idx,:);yActual=net.Layers(end.class)(idy);predictionError{end+1}=(yActual==groundTruth(idx));% #好吧终止%将所有预测误差相加。predictionError=[predictionError{:}];精度=sum(predictionError)/numel(predictionError);终止

要使用此自定义度量函数重新验证网络,请在量化选项,输入自定义度量函数的名称,HComputeModelAccurance选择添加HComputeModelAccurance至应用程序中可用的度量函数列表。选择HComputeModelAccurance作为度量函数使用。

自定义度量函数必须在路径上。如果度量函数不在路径上,此步骤将产生错误。

点击量化和验证

该应用程序量化网络,并显示自定义度量函数的验证结果。

应用程序在验证结果表中仅显示标量值。若要查看具有非标量输出的自定义度量函数的验证结果,请导出数字量化器对象,然后使用验证函数在MATLAB命令窗口中运行。

量化和验证网络后,可以选择导出量化网络。

点击出口按钮在下拉列表中,选择输出量化器创建一个数字量化器对象。要打开GPU编码器应用程序并从量化神经网络生成GPU代码,选择生成代码. 生成GPU代码需要GPU编码器许可证。

如果量化网络的性能不令人满意,可以通过取消选择表中的层来选择不量化某些层。要查看效果,请单击量化和验证再一次

此示例演示如何导入数字量化器对象从基本工作区导入到深层网络量化器应用程序。这允许您使用命令行或应用程序开始对深度神经网络进行量化,然后在应用程序中继续您的工作。

打开深层网络量化器应用程序。

深度网络量化器

在应用程序中,单击刚出现的选择进口dlquantizer对象

深度网络量化器导入dlquantizer对象

在对话框中,选择数字量化器对象以从基本工作区导入。对于本例,使用泉托布您在上面的示例中创建的,为GPU目标量化一个神经网络。

选择要导入的dlquantizer对象

应用程序将导入应用程序中包含的任何数据数字量化器在命令行收集的对象。这些数据可以包括网络量化、校准数据、验证数据和校准统计数据。

应用程序将显示一个表格,其中包含导入应用程序中包含的校准数据数字量化器对象泉托布。在表格右侧,应用程序显示参数动态范围的直方图。直方图的灰色区域表示量化表示无法表示的数据。有关如何解释这些直方图的更多信息,请参阅深度神经网络的量化

深度网络量化器应用程序

要探索具有量化卷积层的神经网络的行为,请使用深层网络量化器应用程序。这个例子量化了可学习的卷积层的参数标识网神经网络。

对于本例,您需要下面列出的产品下载188bet金宝搏FPGA在里面量化工作流先决条件

有关其他要求,请参见量化工作流先决条件

在当前工作文件夹中创建一个名为getLogoNetwork.m。在文件中,输入:

作用net=getLogoNetwork如果~isfile(“LogoNet.mat”)网址=“//www.tatmou.com/金宝appsupportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat”;韦伯斯韦(“LogoNet.mat”,网址);终止数据=负载(“LogoNet.mat”); net=data.net;终止

加载预训练网络。

snet=getlogonnetwork;
snet=SeriesNetwork,属性:Layers:[22×1 nnet.cnn.layer.layer]InputNames:{'imageinput'}OutputNames:{'classoutput'}

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

应用程序使用校准数据练习网络,并收集网络卷积层和完全连接层中权重和偏差的动态范围。应用程序还练习LogoNet网络所有层中激活的动态范围。为了获得最佳量化结果,校准数据必须具有代表性向LogoNet网络输入的e。

量化后,应用程序使用验证数据集测试网络,以了解网络中卷积层量化可学习参数的有限范围和精度的影响。

在本例中,使用logos\u数据集用于校准和验证LogoNet网络的数据集。定义augmentedImageDatastore对象以调整网络数据的大小。然后,将数据分解为校准和验证数据集。

通过使用一个子集,加快校准和验证过程calibrationData验证数据.存储新的简化校准数据集校准数据新的验证数据被简化了验证数据

curDir=pwd;newDir=fullfile(matlabroot、,“例子”,“deeplearning_shared”,“数据”,'logos_dataset.zip');拷贝文件(newDir curDir);解压缩('logos_dataset.zip');imageData=imageDatastore(完整文件(curDir,“logos\u数据集”),...“包含子文件夹”符合事实的“文件扩展名”,“.JPG”,“标签源”,“foldernames”); [calibrationData,validationData]=拆分每个标签(imageData,0.5,“随机化”);calibrationData_concise = calibrationData.subset (1:20);validationData_concise = vaidationData.subset (1:1);

在MATLAB命令提示下,打开Deep Network Quantizer应用程序。

深度网络量化器

点击刚出现的选择量化网络

应用程序验证您的执行环境。

从基本工作区中选择要量化的执行环境和网络。对于本例,选择FPGA执行环境和串联网络斯奈特

选择网络和执行环境

应用程序显示所选网络的图层图。

校准应用程序工具条的一部分,在校准数据,选择augmentedImageDatastore包含校准数据的基本工作区中的对象校准数据

点击校准

这个深层网络量化器应用程序使用校准数据练习网络,并收集网络层中可学习参数的范围信息。

校准完成后,应用程序将显示一个表格,其中包含网络卷积层和完全连接层中的权重和偏差。还将显示网络所有层中激活的动态范围及其校准期间的最小值和最大值。应用程序将显示动态范围的直方图参数的灰色区域。直方图的灰色区域表示量化表示无法表示的数据。有关如何解释这些直方图的更多信息,请参阅深度神经网络的量化

深度网络量化器校准

量化列,表示是否对层中的可学习参数进行量化。你不能量化不是卷积层的层。未量子化的层仍然保持单精度。

验证应用程序工具条的一部分,在验证数据,选择augmentedImageDatastore对象来自包含验证数据的基本工作空间验证数据

硬件设置在toolstrip部分,从表中列出的选项中选择:

仿真环境 行动
MATLAB(在MATLAB中模拟) 在MATLAB中对量化网络进行了仿真,通过与单精度网络的性能比较,验证了量化网络的有效性。
英特尔Arria 10 SoC(arria10soc_int8)

将量化网络部署到Intel®阿里亚®10 . SoC板通过使用arria10soc_int8比特流。通过将性能与网络的单精度版本进行比较,验证量化网络。

Xilinx ZCU102 (zcu102_int8)

将量子化网络部署到Xilinx®Zynq®超尺度+™ MPSoC ZCU102 10 SoC板,通过使用zcu102_int8比特流。通过将性能与网络的单精度版本进行比较,验证量化网络。

Xilinx ZC706(ZC706_int8)

将量化网络部署到Xilinx Zynq-7000 ZC706单板上zc706_int8比特流。通过将性能与网络的单精度版本进行比较,验证量化网络。

当你选择英特尔Arria 10 SoC(arria10soc_int8),Xilinx ZCU102 (zcu102_int8)Xilinx ZC706(ZC706_int8)选项,选择用于部署和验证量化网络的接口目标此表中列出了接口选项。

目标的选择 行动
JTAG 编程中选择的目标FPGA板仿真环境通过使用JTAG电缆。有关详细信息,请参阅JTAG连接(深度学习HDL工具箱)
以太网 编程中选择的目标FPGA板仿真环境通过以太网接口。中指定目标板的IP地址IP地址

对于本例,选择Xilinx ZCU102 (zcu102_int8)选择以太网,然后输入板IP地址。

深度网络量化器硬件设置

验证应用程序工具条的一部分,在量化选项,选择违约度量函数。

点击量化和验证

这个深层网络量化器应用程序将网络中卷积层的权重、激活和偏差量化为缩放的8位整数数据类型,并使用验证数据来运行网络。应用程序根据正在量化的网络类型确定用于验证的度量函数。

网络类型 度量函数
分类

(精度–网络的准确性

对象检测

平均精度–所有检测结果的平均精度。参见evaluateDetectionPrecision(计算机视觉工具箱)

回归

微卫星-网络的均方误差

语义分割 评价语义切分(计算机视觉工具箱)–根据基本事实评估语义分段数据集
单发探测器(SSD)

重量你-每个类的平均欠条,以该类中的像素数加权

验证完成后,应用程序将显示验证结果,包括:

  • 用于验证的度量函数

  • 量化前后度量函数的结果

深度网络量化器验证

如果要使用其他度量函数进行验证,例如使用Top-5精度度量函数而不是默认的Top-1精度度量函数,则可以定义自定义度量函数。将此函数保存在本地文件中。

作用准确度=hComputeAccuracy(预测核心、网络、数据存储)%%计算模型级精度统计负载地面真实值tmp=readall(数据存储);groundTruth=tmp.response;%将预测标签与基本事实进行比较predictionError={};对于idx=1:numel(groundTruth)[~,idy]=max(predictionScores(idx,:);yActual=net.Layers(end.class)(idy);predictionError{end+1}=(yActual==groundTruth(idx));% #好吧终止%将所有预测误差相加。predictionError=[predictionError{:}];精度=sum(predictionError)/numel(predictionError);终止

要使用此自定义度量函数重新验证网络,请在量化选项,输入自定义度量函数的名称hComputeAccuracy选择添加hComputeAccuracy至应用程序中可用的度量函数列表。选择hComputeAccuracy作为度量函数使用。

自定义度量函数必须位于路径上。如果度量函数不在路径上,此步骤将产生错误。

深度网络量化器选择自定义度量函数

点击量化和验证

该应用程序量化网络,并显示自定义度量函数的验证结果。

使用自定义度量函数的深度网络量化器验证

应用程序在验证结果表中仅显示标量值。若要查看具有非标量输出的自定义度量函数的验证结果,请导出数字量化器对象,然后使用验证函数在MATLAB命令窗口中。

量化和验证网络后,可以选择导出量化网络。

点击出口按钮在下拉列表中,选择输出量化器创建一个数字量化器基本工作区中的对象。您可以将量化网络部署到目标FPGA板上,并使用MATLAB检索预测结果。看见部署量化网络示例(深度学习HDL工具箱)

相关实例

参数

默认情况下,深层网络量化器app根据正在量化的网络类型确定用于验证的度量函数。

网络类型 度量函数
分类

(精度–网络的准确性

对象检测

平均精度–所有检测结果的平均精度。参见evaluateDetectionPrecision(计算机视觉工具箱)

回归

微卫星-网络的均方误差

语义分割

重量你–每个类别的平均IoU,由该类别中的像素数加权。请参阅评价语义切分(计算机视觉工具箱)

您还可以指定要使用的自定义度量函数。

在R2020a中引入