主要内容

深度网络量化器

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

描述

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

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

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

  • 评估量化网络的性能。

  • 使用GPU Coder™生成GPU代码来部署量化网络。

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

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

  • 生成一个可模拟的量化网络,您可以在MATLAB中探索,而无需生成代码或部署到硬件。

这个应用程序需要深度学习工具箱模型量化库.要了解量化深度神经网络所需的产品,请参s manbetx 845见量化流程

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

  • MATLAB命令提示符:输入deepNetworkQuantizer

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

例子

全部展开

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

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

将要量化的网络加载到基本工作区中。

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

定义校准和验证数据。

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

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

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

解压缩(“MerchData.zip”);imds = imageDatastore(“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[calData, valData] = splitEachLabel(imds, 0.7,“随机”);aug_calData = augmentedImageDatastore([227 227], calData);aug_valData = augmentedImageDatastore([227 227], valData);

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

deepNetworkQuantizer

在应用程序中,单击并选择量化网络

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

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

app-dnq-select-net.png

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

校准部分的工具条,在下面校准数据,选择augmentedImageDatastore包含校准数据的基本工作空间中的aug_calData.选择校准

深度网络量化器利用标定数据对网络进行训练,为网络层中的可学习参数收集距离信息。

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

app-dnq-calibrate.png

数字转换表的列,表示是否量化该层中的可学习参数。未量化的层在量化后仍保持单精度。

验证部分的工具条,在下面验证数据,选择augmentedImageDatastore包含验证数据的基本工作区中的aug_valData

验证部分的工具条,在下面量化的选择,选择默认的度量函数和极大极小指数方案。选择量化和验证

深度网络量化器将网络中卷积层的权重、激活和偏差量化为缩放的8位整型数据类型,并使用验证数据来练习网络。该应用程序根据被量化的网络类型确定用于验证的默认度量函数。对于分类网络,该应用程序使用Top-1精度。

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

  • 用于验证的度量函数

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

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

app-dnq-validate.png

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

函数准确性= hComputeModelAccuracy(predictionScores, net, dataStore)计算模型级精度统计信息%负载地面真实值tmp = readall(dataStore);groundTruth = tmp.response;%将预测标签与实际实际情况进行比较predictionError = {};idx=1:数字(groundTruth) [~, idy] = max(predictionScores(idx,:));yActual = net.Layers(end).Classes(idy);predictionError{end+1} = (yActual == groundTruth(idx));% #好吧结束求和所有的预测误差。predictionError = [predictionError{:}];精度= sum(predictionError)/numel(predictionError);结束

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

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

app-dnq-custom-metric-fcn.png

选择量化和验证

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

app-dnq-custom-metric-fcn-validate.png

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

如果量化网络的性能不理想,可以通过取消表中的层来选择不量化某些层。中为量化选择不同的指数选择方案的影响量化的选择菜单。要查看这些更改的效果,请选择量化和验证一次。

在校准网络后,可以选择导出量化的网络或dlquantizer对象。选择出口按钮。在下拉菜单中,从以下选项中选择:

  • 出口量化网络—将量化网络添加到基本工作空间。此选项导出一个可模拟的量化网络,您可以在MATLAB中探索,而无需部署到硬件。

  • 出口数字转换器-添加dlquantizer对象添加到基本工作区。你可以保存dlquantizer对象,并使用它来进一步探索深度网络量化器应用程序或命令行,或使用它为目标硬件生成代码。

  • 生成代码-打开GPU编码器应用程序,并从量化神经网络生成GPU代码。生成GPU代码需要GPU Coder™许可证。

此示例向您展示如何导入dlquantizer对象从基本工作区转移到深度网络量化器这允许您使用命令行或应用程序开始量化深度神经网络,并在应用程序中稍后恢复您的工作。

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

deepNetworkQuantizer

在应用程序中,单击并选择导入dlquantizer对象

Deep Network Quantizer导入dlquantizer对象

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

选择要导入的dlquantizer对象

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

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

深度网络量化器应用程序显示校准数据。

要探索具有量化卷积层的神经网络的行为,请使用深度网络量化器的卷积层的可学习参数量化LogoNet用于FPGA目标的神经网络。

对于本例,您需要下面列出的产品s manbetx 845FPGA量化流程

将预训练的网络加载到基本工作空间中进行量化。在当前工作文件夹中创建一个名为getLogoNetwork.m.在文件中输入:

函数net = getLogoNetwork如果~ isfile (“LogoNet.mat”) url =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat”;websave (“LogoNet.mat”url);结束数据=负载(“LogoNet.mat”);Net = data.convnet;结束

加载预训练的网络。

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

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

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

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

在本例中,使用logos_dataset数据集来校准和验证LogoNet网络。定义一个imageDatastore对象,然后将数据分割为校准和验证数据集。

通过使用校准和验证数据的子集,加快本示例的校准和验证过程。存储新的简化校准数据集calData_concise和新的减少验证数据集valData_concise

currentDir = pwd;newDir = fullfile(matlabroot,“例子”“deeplearning_shared”“数据”“logos_dataset.zip”);拷贝文件(newDir currentDir);解压缩(“logos_dataset.zip”);imds = imageDatastore(fullfile(currentDir,“logos_dataset”),...“IncludeSubfolders”,真的,“FileExtensions”“jpg”“LabelSource”“foldernames”);[calData,valData] = splitEachLabel(imds,0.7,“随机”);caldata_简明= caldata .子集(1:20);valdata_简明= valdata .子集(1:6);

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

deepNetworkQuantizer

点击并选择量化网络

设置执行环境为“FPGA”,并选择snet - SeriesNetwork由于网络要量化。

选择要量化的执行环境和网络。

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

校准数据,选择caldata_condensed - ImageDatastore包含校准数据的基本工作空间中的。

点击校准.默认情况下,应用程序使用主机图形处理器来收集校准数据,如果有可用的图形处理器。否则,占用主机CPU。您可以使用校准下拉菜单选择校准环境。

深度网络量化器App使用校准数据对网络进行训练,为网络层中可学习的参数收集距离信息。

当校准完成时,应用程序会显示一个表,其中包含卷积和网络全连接层中的权重和偏差。还显示了网络各层激活的动态范围及其校准期间记录的最小值和最大值。该应用程序显示参数动态范围的直方图。直方图的灰色区域表示不能用量化表示的数据。有关如何解释这些直方图的详细信息,请参见深度神经网络的量化

深度网络量化器校准

数字转换层表的列,表示是否量化该层中的可学习参数。未量化的层保持单精度。

验证数据,选择valdata_condensed - ImageDatastore包含验证数据的基本工作区中的。

硬件设置部分中,选择用于验证量化网络的环境。有关这些选项的详细信息,请参见硬件设置

对于本例,选择Xilinx ZC706 (zc706_int8)而且JTAG

深度网络量化器硬件设置

量化的选择,选择默认的度量函数和极大极小指数方案。有关这些选项的详细信息,请参见量化的选择

点击量化和验证

深度网络量化器App将网络中卷积层的权重、激活和偏差量化为缩放的8位整型数据类型,并使用验证数据来练习网络。该应用程序根据被量化的网络类型确定用于验证的默认度量函数。有关更多信息,请参见量化的选择

验证完成后,应用程序显示验证结果。

深度网络量化器验证

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

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

相关的例子

参数

当你选择新增>量化网络,该应用程序允许您选择量化网络的执行环境。网络如何量化取决于执行环境的选择。

当你选择MATLAB执行环境,应用程序执行神经网络的目标不可知量化。这个选项不要求您有目标硬件,以便在MATLAB中探索量化网络。

根据您的执行环境指定硬件设置。

  • GPU执行环境

    从以下模拟环境中选择:

    模拟环境 行动

    GPU

    在主机GPU上进行模拟

    在主机图形处理器上部署量化网络。通过将性能与单精度版本的网络进行比较来验证量化网络。

    MATLAB

    MATLAB仿真

    在MATLAB中对量化网络进行仿真。通过将性能与单精度版本的网络进行比较来验证量化网络。

  • FPGA执行环境

    从以下模拟环境中选择:

    模拟环境 行动

    MATLAB

    MATLAB仿真

    在MATLAB中对量化网络进行仿真。通过将性能与单精度版本的网络进行比较来验证量化网络。

    英特尔Arria 10 SoC

    arria10soc_int8

    将量化网络部署到Intel上®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 SoCXilinx ZCU102,或Xilinx ZC706选项,另外选择用于部署和验证量化网络的接口。

    目标的选择 行动
    JTAG 程序所选的目标FPGA板下模拟环境使用JTAG电缆。有关更多信息,请参见JTAG连接(深度学习HDL工具箱)
    以太网 中所选目标FPGA板的编程模拟环境通过以太网接口。中指定目标板的IP地址IP地址字段。

  • CPU执行环境

    硬件设置按钮已禁用。但是,您必须使用raspi函数来建立到Raspberry Pi™板的连接量化和验证的一步。

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

网络类型 度量函数
分类

(精度—网络的准确性

对象检测

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

回归

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

语义分割

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

还可以指定自定义度量函数用于验证。

您可以选择用于网络量化的指数选择方案:

  • 极大极小-(默认)根据校准统计信息中的范围信息评估指数,避免溢出。

  • 柱状图-基于分布的缩放,评估指数以最佳拟合校准数据。

  • 出口量化网络—网络校准完成后,量化并将量化后的网络添加到基础工作空间。这个选项导出一个可模拟的量化网络,quantizedNet,您可以在MATLAB中探索,而无需部署到硬件。此选项相当于使用数字转换在命令行。

    导出的量化网络不支持代码生成,万博1manbetxquantizedNet

  • 出口数字转换器-添加dlquantizer对象添加到基本工作区。你可以保存dlquantizer对象,并使用它来进一步探索深度网络量化器应用程序或命令行,或使用它为目标硬件生成代码。

  • 生成代码-打开GPU Coder应用,从量化和验证的神经网络生成GPU代码。生成GPU代码需要GPU Coder许可证。

版本历史

R2020a中引入

全部展开