主要内容

深度网络量化器

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

描述

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

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

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

  • 评估量化网络的性能。

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

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

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

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

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

  • 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网络,

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

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

点击校准

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

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

数字转换表的列,表示是否量化该层中的可学习参数。不是卷积层的层不能量子化,因此不能被选择。未量化的层在量化后仍保持单精度。

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

验证部分的工具条,在下面量化的选择,选择默认的度量函数。

点击量化和验证

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

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

  • 用于验证的度量函数

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

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

如果您想使用不同的度量函数进行验证,例如使用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作为度量函数来使用。

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

点击量化和验证

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

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

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

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

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

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

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

deepNetworkQuantizer

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

Deep Network Quantizer导入dlquantizer对象

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

选择要导入的dlquantizer对象

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

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

深度网络量化应用程序

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

对于本例,您需要下面列出的产品下载188bet金宝搏FPGA量化流程

有关其他要求,请参见量化流程

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

函数net = getLogoNetwork如果~ isfile (“LogoNet.mat”) url =“//www.tatmou.com/金宝appsupportfiles/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'}

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

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

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

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

的子集,加快校准和验证过程calibrationData而且validationData.存储新的简化校准数据集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”),...“IncludeSubfolders”,真的,“FileExtensions”“jpg”“LabelSource”“foldernames”);[calibrationData, validationData] = splitEachLabel(imageData, 0.5,“随机”);calibrationdata_simplify = calibrationdata .子集(1:20);validationdata_简明= vaidationdata .子集(1:1);

在MATLAB命令提示符下,打开深度网络量化器应用程序。

deepNetworkQuantizer

点击并选择量化网络

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

从基本工作空间选择要量化的执行环境和网络。在本例中,选择FPGA执行环境和串联网络snet

选择网络和执行环境

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

校准部分的应用程序工具条,在校准数据,选择augmentedImageDatastore包含校准数据的基本工作空间中的calibrationData_concise

点击校准

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

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

深度网络量化器校准

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

验证部分的应用程序工具条,在验证数据,选择augmentedImageDatastore包含验证数据的基本工作区中的validationData_concise

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

模拟环境 行动
MATLAB (MATLAB仿真) 在MATLAB中对量化网络进行仿真。通过将性能与单精度版本的网络进行比较来验证量化网络。
Intel 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比特流。通过将性能与单精度版本的网络进行比较来验证量化网络。

当你选择Intel 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将网络中卷积层的权重、激活和偏差量化为缩放的8位整型数据类型,并使用验证数据来练习网络。该应用程序根据被量化的网络类型确定用于验证的度量函数。

网络类型 度量函数
分类

(精度—网络的准确性

对象检测

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

回归

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

语义分割 evaluateSemanticSegmentation(计算机视觉工具箱)-根据真实情况评估语义分割数据集
单次探测器(SSD)

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

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

  • 用于验证的度量函数

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

深度网络量化器验证

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

函数准确性= hComputeAccuracy(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);结束

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

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

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

点击量化和验证

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

带有自定义度量函数的深度网络量化器验证

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

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

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

相关的例子

参数

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

网络类型 度量函数
分类

(精度—网络的准确性

对象检测

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

回归

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

语义分割

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

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

R2020a中引入