主要内容

深层网络量化器

量化深神经网络至8位缩放整数数据类型

描述

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

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

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

  • 评估量化网络的性能。

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

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

  • 使用c++代码将量化网络部署到ARM Cortex-A微控制器上MATLAB®编码器™

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

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

  • matlab命令提示符:输入deepNetworkQuantizer

  • MATLAB TOOLSTRIP:在应用程序选项卡,在机器学习和深度学习,单击“应用”图标。

例子

全部展开

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

这个例子使用了带有GPU执行环境的DAG网络。

将网络加载到基本工作空间中进行量化。

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

定义校准和验证数据。

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

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

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

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”...'upplyubfolders',真的,...'labelsource''foldernames');[Caldata,Valdata] = SpliteachLabel(IMDS,0.7,'随机');aug_calData = augmentedImageDatastore([227 227], calData);aug_valData = augmentedImageDatastore([227 227], valData);

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

deepNetworkQuantizer

在应用程序中,单击新的并选择数字转换网络

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

在对话框中,选择执行环境和网络以从基础工作空间量化。在此示例中,选择GPU执行环境和DAG网络,

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

在里面校准工具架的一部分,下校准数据,选择augmentedImageDatastore对象,该对象包含校准数据,calData

点击校准

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

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

在里面量化列,表示是否对层中的可学习参数进行量化。不是卷积层的图层不能被量化,因此无法选择。在量化之后,未量化的层保持单精度。

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

在里面证实工具架的一部分,下量化的选择,选择默认度量函数。

点击数字转换和验证

深层网络量化器量化网络中的卷积层的权重,激活和偏置,以缩放8位整数数据类型,并使用验证数据来锻炼网络。该应用程序根据正在量化的网络类型确定用于验证的默认度量功能。对于分类网络,应用程序使用前1个精度。

当验证完成时,应用程序显示验证的结果,包括:

  • 用于验证的度量功能

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

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

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

功能hComputeModelAccuracy = hComputeModelAccuracy(predictionScores, net, dataStore)%%计算模型级精度统计负载地面真实值tmp = readall(数据存储);groundTruth = tmp.response;%与实际地面真相与预测标签相比predictionerror = {};idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx,:)); / /将groundTruth改为groundTruthyActual = net.Layers(结束). class(补贴);predictionError{end+1} = (yActual == groundTruth(idx));% #好吧结束%汇总所有预测错误。predictionerror = [predictionerror {:}];精度= SUM(预测值)/ NUMER(预测值);结束

使用此自定义度量功能来重新验证网络量化的选择,输入自定义度量函数的名称,hComputeModelAccuracy.选择添加加上hComputeModelAccuracy到应用程序中可用的度量函数列表。选择hComputeModelAccuracy作为度量函数使用。

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

点击数字转换和验证

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

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

在对网络进行量化和验证之后,可以选择导出量化的网络。

单击出口按钮。在下拉菜单中选择出口量化器创建一个dlquantizer对象在基本工作区中。打开GPU编码器应用程序,从量化的神经网络生成GPU代码,选择生成代码.生成GPU代码需要GPU编码器许可证。

如果量化网络的性能不理想,可以通过取消选择表中的层来选择不量化某些层。要查看效果,请单击数字转换和验证一次。

这个例子向你展示了如何导入dlquantizer对象从基本工作空间导入深层网络量化器这允许您使用命令行或应用程序开始深度神经网络的量化,并在应用程序的稍后继续您的工作。

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

deepNetworkQuantizer

在应用程序中,单击新的并选择进口dlquantizer对象

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

在对话框中,选择dlquantizer对象以从基本工作区导入。对于本例,使用quantObj量化GPU目标的神经网络。

选择要导入的DlQuantizer对象

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

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

深网络量化器应用程序

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

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

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

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

功能网= getLogoNetwork如果~ isfile ('logonet.mat') url =“//www.tatmou.com/金宝appsupportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat”;WebSave('logonet.mat'url);结束data =负载('logonet.mat');net = data.convnet;结束

加载佩带的网络。

snet = getlogonetwork;
snet = SeriesNetwork with properties: Layers: [22×1 net.cnn.layer. layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}

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

该应用程序使用校准数据来锻炼网络,并收集在卷积和网络全连接层中的权重和偏差的动态范围。该应用程序还在LogoNet网络的所有层中执行动态范围的激活。为了获得最好的量化结果,校准数据必须是LogoNet网络输入的代表性数据。

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

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

快速校准和验证过程,使用的子集calibrationDatavalidationData.存储新的简化校准数据集CalibrationData_concise.新的验证数据被简化了validationData_concise

curDir = pwd;newDir = fullfile (matlabroot,“例子”“deeplearning_shared”'数据''logos_dataset.zip');拷贝文件(newDir curDir);解压缩('logos_dataset.zip');imagedata = imagedataStore(fullfile(curdir,'logos_dataset'),...'upplyubfolders',真的,“FileExtensions”“jpg”'labelsource''foldernames');[calibrationData, validationData] = splitEachLabel(imageData, 0.5,'随机');calibrationData_concise = calibrationData.subset (1:20);validationData_concise = vaidationData.subset (1:1);

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

deepNetworkQuantizer

点击新的并选择数字转换网络

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

选择执行环境和网络以从基础工作区量化。在此示例中,选择FPGA执行环境和系列网络snet

选择一个网络和执行环境

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

在里面校准App Toolstrip的部分,下校准数据,选择augmentedImageDatastore对象来自包含校准数据的基础工作空间CalibrationData_concise.

点击校准

深层网络量化器App使用校准数据对网络进行锻炼,收集网络层中可学习参数的范围信息。

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

深度网络量化器校准

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

在里面证实App Toolstrip的部分,下验证数据,选择augmentedImageDatastore对象来自包含验证数据的基本工作空间validationData_concise

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

模拟环境 行动
Matlab(模拟在Matlab中) 在MATLAB中对量化网络进行仿真。通过将性能与网络的单精度版本进行比较来验证量化网络。
英特尔Arria 10 SoC(Arria10soc_int8)

将量子化网络部署到因特尔®Arria®10 . SoC板通过使用arria10soc_int8比特流。通过将性能与网络的单精度版本进行比较来验证量化网络。

Xilinx ZCU102 (zcu102_int8)

将量子化网络部署到Xilinx®Zynq.®UltraScale +™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地址。

深度网络量化器硬件设置

在里面证实App Toolstrip的部分,下量化的选择,选择默认度量函数。

点击数字转换和验证

深层网络量化器应用程序量化网络中卷积层的权重、激活和偏差,以缩放8位整数数据类型,并使用验证数据来锻炼网络。该应用程序根据被量化的网络类型确定一个用于验证的度量函数。

类型的网络 度量函数
分类

(精度—网络的准确性

对象检测

平均精度-所有检测结果的平均精度。看到evaluateDetectionPrecision(计算机视觉工具箱)

回归

均方误差-网络的均方误差

语义细分 evaluateSemanticSegmentation(计算机视觉工具箱)-评估语义分割数据集与地面真理
单次探测器(SSD)

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

当验证完成时,应用程序显示验证的结果,包括:

  • 用于验证的度量功能

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

深度网络量化器验证

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

功能hComputeAccuracy = hComputeAccuracy(predictionScores, net, dataStore)%%计算模型级精度统计负载地面真实值tmp = readall(数据存储);groundTruth = tmp.response;将预测标签与地面真实值进行比较predictionerror = {};idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx,:)); / /将groundTruth改为groundTruthyActual = net.Layers(结束). class(补贴);predictionError{end+1} = (yActual == groundTruth(idx));% #好吧结束%汇总所有预测错误。predictionerror = [predictionerror {:}];精度= SUM(预测值)/ NUMER(预测值);结束

通过使用此自定义度量函数来重新验证网络量化的选择,输入自定义度量函数的名称hComputeAccuracy.选择添加加上hComputeAccuracy到应用程序中可用的度量函数列表。选择hComputeAccuracy作为度量函数使用。

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

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

点击数字转换和验证

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

深度网络量化器验证与自定义度量函数

该应用程序仅在验证结果表中显示标量值。要查看具有非卡拉尔输出的自定义度量功能的验证结果,导出dlquantizer对象,然后使用验证函数。

在对网络进行量化和验证之后,可以选择导出量化的网络。

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

相关的例子

参数

默认情况下,深层网络量化器应用程序确定用于基于正在量化的网络类型用于验证的度量功能。

类型的网络 度量函数
分类

(精度—网络的准确性

对象检测

平均精度-所有检测结果的平均精度。看到evaluateDetectionPrecision(计算机视觉工具箱)

回归

均方误差-网络的均方误差

语义细分

WeightedIOU-每个类的平均欠条,以该类中的像素数加权。看到evaluateSemanticSegmentation(计算机视觉工具箱)

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

介绍了R2020a