主要内容

dlquantizer

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

自从R2020a

描述

使用dlquantizer对象通过将权重、偏差和激活量化为8位缩放整数数据类型来降低深度神经网络的内存需求。您可以为GPU、FPGA、CPU部署创建和验证量化网络的行为,或在MATLAB中探索量化网络®

对于CPU和GPU部署,该软件通过将卷积层的权重、偏差和激活量化为8位缩放整数数据类型,为卷积深度神经网络生成代码。量化是通过提供校准结果文件产生的校准函数codegen(MATLAB编码器)命令。

代码生成不支持量化深度神经网络生成金宝app数字转换函数。

该对象要求深度学习工具箱模型量化库.要了解量化深度神经网络所需的产品,请参下载188bet金宝搏见量化流程

创建

描述

例子

quantObj= dlquantizer (创建一个dlquantizer对象为指定的深度神经网络,

例子

quantObj= dlquantizer (名称,值创建一个dlquantizer使用由一个或多个名称-值对参数指定的其他选项。

输入参数

全部展开

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

属性

全部展开

此属性是只读的。

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

量化网络的执行环境,指定为“图形”FPGA的“CPU”,或MATLAB的.网络如何量化取决于执行环境的选择。

MATLAB的执行环境表明将执行神经网络的目标不可知量化。这个选项不要求您有目标硬件,以便在MATLAB中探索量化网络。

例子:“ExecutionEnvironment”FPGA的

是否使用仿真验证网络量化的FPGA行为,指定为以下值之一:

  • “上”-通过在MATLAB中模拟量化网络,并将原始单精度网络的预测结果与量化网络的模拟预测结果进行比较,验证量化网络的行为。

  • “关闭”-生成代码并在目标硬件上验证量化网络的行为。

请注意

此选项仅在以下情况下有效ExecutionEnvironment设置为FPGA的

请注意

或者,您可以使用数字转换方法来创建一个可模拟的量化网络。可模拟的量化网络能够可见网络的量化层、权重和偏差,以及可模拟的量化推理行为。

例子:“模拟”“上”

对象的功能

校准 模拟和收集深度神经网络的范围
验证 量化和验证一个深度神经网络
数字转换 量化深度神经网络

例子

全部折叠

这个例子展示了如何量化GPU神经网络卷积层中的可学习参数,并探索量化网络的行为。在这个例子中,你量化挤压网神经网络后,重新训练网络分类新图像根据训练深度学习网络对新图像进行分类的例子。在这个例子中,通过量化,网络所需的内存减少了大约75%,而网络的准确性不受影响。

加载预训练的网络。为训练深度学习网络分类新图像示例的输出网络。

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

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

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

验证数据用于量化后的网络测试,以了解量化卷积层的有限范围和精度在网络中的影响。

在本例中,使用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);

创建一个dlquantizer对象并指定要量化的网络。

quantObj = dlquantizer(net);

定义一个度量函数,用于比较量化前后网络的行为。本例使用hComputeModelAccuracy度量函数。

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

指定a中的度量函数dlquantizationOptions对象。

quantOpts = dlquantizationOptions(“MetricFcn”,{@(x)hComputeModelAccuracy(x, net, aug_valData)});

使用校准使用样本输入练习网络并收集距离信息的功能。的校准函数对网络进行练习,并收集网络的卷积层和全连接层中权重和偏差的动态范围,以及网络各层中激活的动态范围。函数返回一个表。表的每一行都包含优化网络的一个可学习参数的范围信息。

calResults = calibrate(quantObj, aug_calData)
calResults =121×5表优化层名称网络层名称可学的/激活MinValue MaxValue  ____________________________ ____________________ ________________________ _________ ________ {' conv1_Weights’}{‘conv1}“权重”-0.91985 - 0.88489{‘conv1_Bias}{‘conv1}“偏见”-0.07925 - 0.26343{‘fire2-squeeze1x1_Weights}{‘fire2-squeeze1x1}“权重”-1.38 - 1.2477{‘fire2-squeeze1x1_Bias}{‘fire2-squeeze1x1}“偏见”-0.11641 - 0.24273{‘fire2-expand1x1_Weights}{‘fire2-expand1x1}“权重”-0.74060.90982 {'fire2-expand1x1_Bias'} {'fire2-expand1x1'} "Bias" -0.060056 0.14602 {'fire2- expand33_weights '} {'fire2-expand3x3'} "Weights" -0.74397 0.66905 {'fire2- expand33_bias '} {'fire2-expand3x3'} "Bias" -0.051778 0.074239 {'fire3-squeeze1x1_Weights'} {'fire3- squeeze11x1 '} "Weights" -0.7712 0.68917 {'fire3-squeeze1x1_Bias'} {'fire3-squeeze1x1'} "Bias" -0.10138 0.32675 {'fire3-expand1x1_Weights'} {'fire3-expand1x1'} "Weights" -0.72035 0.9743 {'fire3-expand1x1_Bias'} {'fire3-expand1x1'}"Bias" -0.067029 0.30425 {'fire3-expand3x3_Weights' } {'fire3-expand3x3' } "Weights" -0.61443 0.7741 {'fire3-expand3x3_Bias' } {'fire3-expand3x3' } "Bias" -0.053613 0.10329 {'fire4-squeeze1x1_Weights'} {'fire4-squeeze1x1'} "Weights" -0.7422 1.0877 {'fire4-squeeze1x1_Bias' } {'fire4-squeeze1x1'} "Bias" -0.10885 0.13881 ⋮

使用验证函数量化网络卷积层中的可学习参数,并对网络进行训练。函数中定义的度量函数dlquantizationOptions对象来比较量化前后的网络结果。

valResults = validate(quantObj, aug_valData, quantOpts)
valResults =带字段的结构:NumSamples: 20 MetricResults: [1×1 struct] Statistics: [2×2 table]

检查验证输出以查看量化网络的性能。

valResults.MetricResults.Result
ans =2×2表NetworkImplementation MetricOutput  _____________________ ____________ {' 浮点}{“量子化”}1
valResults。统计数据
ans =2×2表NetworkImplementation LearnableParameterMemory(字节 ) _____________________ _______________________________ {' 浮点}2.9003 e + 06{“量子化”}7.3393 e + 05

在这个例子中,通过量化,网络所需的内存减少了大约75%。不影响网络的准确性。

在dlquantizer对象中指定的网络卷积层的权重、偏差和激活现在使用缩放的8位整型数据类型。

这个例子展示了如何量化和验证一个CPU目标的神经网络。此工作流类似于其他执行环境,但在验证之前必须建立一个raspi连接,并将其指定为目标使用dlquantizationOptions

首先,加载网络。这个例子使用预训练的网络squeezenet

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

然后定义校准和验证数据,而且valDS分别。

解压缩(“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);

创建dlquantizer对象,并指定CPU执行环境。

Dq = dlquantizer(净,“ExecutionEnvironment”“CPU”
dq = dlquantizer with properties: NetworkObject: [1×1 DAGNetwork] ExecutionEnvironment: 'CPU'

校准网络。

calResults =校准(dq,aug_calData,“UseGPU”“关闭”
calResults =122×5表优化层名称网络层名称可学的/激活MinValue MaxValue  ____________________________ ____________________ ________________________ _________ ________ {' conv1_Weights’}{‘conv1}“权重”-0.91985 - 0.88489{‘conv1_Bias}{‘conv1}“偏见”-0.07925 - 0.26343{‘fire2-squeeze1x1_Weights}{‘fire2-squeeze1x1}“权重”-1.38 - 1.2477{‘fire2-squeeze1x1_Bias}{‘fire2-squeeze1x1}“偏见”-0.11641 - 0.24273{‘fire2-expand1x1_Weights}{‘fire2-expand1x1}“权重”-0.74060.90982 {'fire2-expand1x1_Bias'} {'fire2-expand1x1'} "Bias" -0.060056 0.14602 {'fire2- expand33_weights '} {'fire2-expand3x3'} "Weights" -0.74397 0.66905 {'fire2- expand33_bias '} {'fire2-expand3x3'} "Bias" -0.051778 0.074239 {'fire3-squeeze1x1_Weights'} {'fire3- squeeze11x1 '} "Weights" -0.7712 0.68917 {'fire3-squeeze1x1_Bias'} {'fire3-squeeze1x1'} "Bias" -0.10138 0.32675 {'fire3-expand1x1_Weights'} {'fire3-expand1x1'} "Weights" -0.72035 0.9743 {'fire3-expand1x1_Bias'} {'fire3-expand1x1'}"Bias" -0.067029 0.30425 {'fire3-expand3x3_Weights' } {'fire3-expand3x3' } "Weights" -0.61443 0.7741 {'fire3-expand3x3_Bias' } {'fire3-expand3x3' } "Bias" -0.053613 0.10329 {'fire4-squeeze1x1_Weights'} {'fire4-squeeze1x1'} "Weights" -0.7422 1.0877 {'fire4-squeeze1x1_Bias' } {'fire4-squeeze1x1'} "Bias" -0.10885 0.13881 ⋮

使用MATLAB支持包实现树莓金宝app派硬件功能,raspi来创建与树莓派的连接。在下面的代码中,替换:

  • raspiname树莓派的名称或地址

  • 用户名用你的用户名

  • 密码用你的密码

% r = raspi('raspiname','username','password')

例如,

R =树皮(“gpucoder-raspberrypi-7”“π”matlab的
r = raspi with properties: DeviceAddress: ' gucoderraspberrypi -7' Port: 18734 BoardName: '树莓派3 Model B+' availableeleds: {'led0'} AvailableDigitalPins: [2,3,4,5,6,7,8,9,10,11,12,13,14,19,20,22,22,23,24,25,26,27] AvailableSPIChannels: {} AvailableI2CBuses: {} AvailableWebcams: {} I2CBusSpeed: AvailableCANInterfaces:{}支持的外设金宝app

指定raspi对象作为量化网络的目标。

选项= dlquantizationOptions(“目标”右)
opts = dlquantizationOptions属性:MetricFcn: {} Bitstream: "目标:[1×1 raspi]

方法验证量化网络验证函数。

valResults = validate(dq,aug_valData,opts)
codegen\lib\validate_predict_int8\pil\validate_predict_int8要终止执行:清除validate_predict_int8_pil启动应用程序validate_predict_int8.elf###主机应用程序产生以下标准输出(stdout)和标准错误(stderr)消息:
valResults =带字段的结构:NumSamples: 20 MetricResults: [1×1 struct] Statistics: []

检查验证输出以查看量化网络的性能。

valResults.MetricResults.Result
ans =2×2表NetworkImplementation MetricOutput  _____________________ ____________ {' 浮点}0.95 0.95{“量子化”}

通过将卷积层的权重、偏差和激活量化为8位缩放整数数据类型,减少深度神经网络的内存占用。这个例子展示了如何使用深度学习工具箱模型量化库和深度学习HDL工具箱来部署int8网络到目标FPGA板。

在这个例子中,你需要:

  • 深度学习工具箱™

  • 深度学习HDL工具箱™

  • 深度学习工具箱模型量化库

  • 用于Xilinx FPGA和SoC器件的深度学习HD金宝appL工具箱支持包

  • MATLAB编程接口的深度学习。

负荷预训练网络

加载预训练好的LogoNet网络,分析网络结构。

snet = getLogoNetwork;deepNetworkDesigner (snet);

加载数据

本例使用logos_dataset数据集。该数据集由320张图像组成。每张图像大小为227 * 227,有三个颜色通道(RGB)。创建一个augmentedImageDatastore用于校准和验证的对象。通过将校准数据集减少到20个图像,加快校准和验证。在对量化网络进行验证时,MATLAB仿真工作流的最大图像限制为5张。将验证数据集大小减少到5个图像。在验证量化网络时,FPGA验证工作流的最大限制是一个图像。将FPGA验证数据集缩减为单个图像。

curDir = pwd;解压缩(“logos_dataset.zip”);imageData = imageDatastore(fullfile(curDir,“logos_dataset”),...“IncludeSubfolders”,真的,“FileExtensions”“jpg”“LabelSource”“foldernames”);[calibrationData, validationData] = splitEachLabel(imageData, 0.5,“随机”);calibrationData_reduced = calibrationdata .子集(1:20);validationData_simulation = validationdata .子集(1:5);validationData_FPGA = validationdata .子集(1:1);

生成网络校准结果文件

创建一个dlquantizer(深度学习HDL工具箱)对象并指定要量化的网络。指定执行环境为FPGA。

dlQuantObj_simulation = dlquantizer(snet,“ExecutionEnvironment”“FPGA”“模拟”“上”);dlQuantObj_FPGA = dlquantizer(snet,“ExecutionEnvironment”“FPGA”);

使用校准(深度学习HDL工具箱)函数使用样本输入练习网络并收集范围信息。的校准函数收集权重和偏差的动态范围。校准函数返回一个表。表的每一行包含量子化网络的一个可学习参数的范围信息。

校准(dlQuantObj_simulation calibrationData_reduced)
ans =35×5表优化层名称网络层名称可学的/激活MinValue MaxValue  ____________________________ __________________ ________________________ ___________ __________ {' conv_1_Weights’}{‘conv_1}“权重”-0.048978 - 0.039352{‘conv_1_Bias}{‘conv_1}“偏见”0.99996 - 1.0028{‘conv_2_Weights}{‘conv_2}“权重”-0.055518 - 0.061901{‘conv_2_Bias}{‘conv_2}“偏见”-0.00061171 - 0.00227{‘conv_3_Weights}{‘conv_3}“权重”-0.045942 - 0.046927{‘conv_3_Bias} {' conv_3 '}"Bias" -0.0013998 0.0015218 {'conv_4_Weights'} {'conv_4'} "Weights" -0.045967 0.051 {'conv_4_Bias'} {'conv_4'} "Bias" -0.00164 0.0037892 {'fc_1_Weights'} {'fc_1'} "Weights" -0.051394 0.054344 {'fc_1_Bias'} {'fc_1'} "Bias" -0.00052319 0.00084454 {'fc_2_Weights'} {'fc_2'} "Weights" -0.05016 0.051557 {'fc_2_Bias'} {'fc_2'} "Bias" -0.0017564 0.0018502 {'fc_3_Weights'} {'fc_3'} "Weights" -0.050706 0.04678 {'fc_3_Bias'} {'fc_3'} "Bias" -0.02951 0.024855 {'imageinput'} {'imageinput'}"Activations" 0 255 {'imageinput_normalization'} {'imageinput'} "Activations" -139.34 193.72 `
校准(dlQuantObj_FPGA calibrationData_reduced)
ans =35×5表优化层名称网络层名称可学的/激活MinValue MaxValue  ____________________________ __________________ ________________________ ___________ __________ {' conv_1_Weights’}{‘conv_1}“权重”-0.048978 - 0.039352{‘conv_1_Bias}{‘conv_1}“偏见”0.99996 - 1.0028{‘conv_2_Weights}{‘conv_2}“权重”-0.055518 - 0.061901{‘conv_2_Bias}{‘conv_2}“偏见”-0.00061171 - 0.00227{‘conv_3_Weights}{‘conv_3}“权重”-0.045942 - 0.046927{‘conv_3_Bias} {' conv_3 '}"Bias" -0.0013998 0.0015218 {'conv_4_Weights'} {'conv_4'} "Weights" -0.045967 0.051 {'conv_4_Bias'} {'conv_4'} "Bias" -0.00164 0.0037892 {'fc_1_Weights'} {'fc_1'} "Weights" -0.051394 0.054344 {'fc_1_Bias'} {'fc_1'} "Bias" -0.00052319 0.00084454 {'fc_2_Weights'} {'fc_2'} "Weights" -0.05016 0.051557 {'fc_2_Bias'} {'fc_2'} "Bias" -0.0017564 0.0018502 {'fc_3_Weights'} {'fc_3'} "Weights" -0.050706 0.04678 {'fc_3_Bias'} {'fc_3'} "Bias" -0.02951 0.024855 {'imageinput'} {'imageinput'}"Activations" 0 255 {'imageinput_normalization'} {'imageinput'} "Activations" -139.34 193.72 `

创建目标对象

创建一个目标对象,该对象具有目标设备的自定义名称和用于将目标设备连接到主机的接口。接口选项为JTAG和Ethernet。要使用JTAG,请安装Xilinx™Vivado™Design Suite 2020.2。要设置Xilinx Vivado工具路径,输入:

% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.2\bin\ Vivado .bat');

要创建目标对象,输入:

hTarget = dlhdl。目标(“Xilinx”“界面”“以太网”);

或者,您也可以使用JTAG接口。

% hTarget = dlhdl。目标(“Xilinx”,“界面”,'JTAG');

创建dlQuantizationOptions对象

创建一个dlquantizationOptions对象。指定目标位流和目标板接口。默认的度量函数是Top-1精度度量函数。

options_FPGA = dlquantizationOptions(“比特流”“zcu102_int8”“目标”, hTarget);options_simulation = dlquantizationOptions;

要使用自定义度量函数,请在dlquantizationOptions对象。

options_FPGA = dlquantizationOptions(“MetricFcn”{@ (x) hComputeAccuracy (x, snet validationData_FPGA)},“比特流”“zcu102_int8”“目标”, hTarget);options_simulation = dlquantizationOptions(“MetricFcn”{@ (x) hComputeAccuracy (x, snet validationData_simulation)})

验证量化网络

使用验证函数量化网络卷积层中的可学习参数。的验证函数在MATLAB中对量化网络进行了仿真。的验证函数中定义的度量函数dlquantizationOptions对象将单数据类型网络对象的结果与量化网络对象的结果进行比较。

prediction_simulation = dlQuantObj_simulation.validate(validationData_simulation,options_simulation)
编译段:conv_1>>relu_4…编译段:conv_1>>relu_4…完成了。编译段:maxpool_4…编译段:maxpool_4…完成了。编译腿:fc_1>>fc_3…编译腿:fc_1>>fc_3…完成了。
prediction_simulation =带字段的结构:NumSamples: 5 MetricResults: [1×1 struct] Statistics: []

对于FPGA上的验证,validate函数:

  • 编程FPGA板使用输出编译方法和编程文件

  • 下载网络权重和偏差

  • 比较量化前后网络的性能

prediction_FPGA = dlQuantObj_FPGA.validate(validationData_FPGA,options_FPGA)
###编译深度学习FPGA原型的网络…###目标FPGA位流zcu102_int8。###网络包括以下层:1“imageinput”图像输入227×227×3图片zerocenter正常化和randfliplr的扩增(SW层)2 conv_1卷积96 5×5×3旋转步[1]和填充[0 0 0 0](HW层)3的relu_1 ReLU ReLU (HW层)4“maxpool_1”马克斯池3×3马克斯池步(2 - 2)和填充[0 0 0 0](HW层)5 conv_2卷积128 3×3×96旋转步[1]和填充[0 0 0 0](HW层)6的relu_2 ReLU ReLU (HW层)7 maxpool_2马克斯池3×3马克斯池步(2 - 2)和填充[0 0 0 0](HW层)8 conv_3卷积384 3×3×128旋转步[1]和填充[0 0 0 0](HW层)9“relu_3”ReLU ReLU (HW层)10“maxpool_3”马克斯池3×3 max池步(2 - 2)和填充[0 0 0 0](HW层)11 conv_4卷积128 3×3×384旋转步(2 - 2)和填充[0 0 0 0](HW层)12“relu_4”ReLU ReLU (HW层)13“maxpool_4”马克斯池3×3马克斯池与步幅(2 - 2)和填充(0 0 00] (HW Layer) 14 'fc_1' Fully Connected 2048 fully connected layer (HW Layer) 15 'relu_5' ReLU ReLU (HW Layer) 16 'dropout_1' Dropout 50% dropout (HW Layer) 17 'fc_2' Fully Connected 2048 fully connected layer (HW Layer) 18 'relu_6' ReLU ReLU (HW Layer) 19 'dropout_2' Dropout 50% dropout (HW Layer) 20 'fc_3' Fully Connected 32 fully connected layer (HW Layer) 21 'softmax' Softmax softmax (HW Layer) 22 'classoutput' Classification Output crossentropyex with 'adidas' and 31 other classes (SW Layer) ### Notice: The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software. ### Notice: The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software. ### Compiling layer group: conv_1>>relu_4 ... ### Compiling layer group: conv_1>>relu_4 ... complete. ### Compiling layer group: maxpool_4 ... ### Compiling layer group: maxpool_4 ... complete. ### Compiling layer group: fc_1>>fc_3 ... ### Compiling layer group: fc_1>>fc_3 ... complete. ### Allocating external memory buffers: offset_name offset_address allocated_space _______________________ ______________ ________________ "InputDataOffset" "0x00000000" "12.0 MB" "OutputResultOffset" "0x00c00000" "4.0 MB" "SchedulerDataOffset" "0x01000000" "4.0 MB" "SystemBufferOffset" "0x01400000" "36.0 MB" "InstructionDataOffset" "0x03800000" "8.0 MB" "ConvWeightDataOffset" "0x04000000" "12.0 MB" "FCWeightDataOffset" "0x04c00000" "12.0 MB" "EndOffset" "0x05800000" "Total: 88.0 MB" ### Network compilation complete. ### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA. ### Finished writing input activations. ### Running single input activation. Deep Learning Processor Bitstream Build Info Resource Utilized Total Percentage ------------------ ---------- ------------ ------------ LUTs (CLB/ALM)* 248358 274080 90.62 DSPs 384 2520 15.24 Block RAM 581 912 63.71 * LUT count represents Configurable Logic Block(CLB) utilization in Xilinx devices and Adaptive Logic Module (ALM) utilization in Intel devices. ### Notice: The layer 'imageinput' of type 'ImageInputLayer' is split into an image input layer 'imageinput' and an addition layer 'imageinput_norm' for normalization on hardware. ### Notice: The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software. ### Notice: The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software. Deep Learning Processor Estimator Performance Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 40142478 0.18247 1 40142478 5.5 ____imageinput_norm 216472 0.00098 ____conv_1 6825671 0.03103 ____maxpool_1 3755088 0.01707 ____conv_2 10440701 0.04746 ____maxpool_2 1447840 0.00658 ____conv_3 9405685 0.04275 ____maxpool_3 1765856 0.00803 ____conv_4 1819636 0.00827 ____maxpool_4 28098 0.00013 ____fc_1 2651288 0.01205 ____fc_2 1696632 0.00771 ____fc_3 89511 0.00041 * The clock frequency of the DL processor is: 220MHz Deep Learning Processor Bitstream Build Info Resource Utilized Total Percentage ------------------ ---------- ------------ ------------ LUTs (CLB/ALM)* 168645 274080 61.53 DSPs 800 2520 31.75 Block RAM 453 912 49.67 * LUT count represents Configurable Logic Block(CLB) utilization in Xilinx devices and Adaptive Logic Module (ALM) utilization in Intel devices. ### Finished writing input activations. ### Running single input activation.
prediction_FPGA =带字段的结构:NumSamples: 1 MetricResults: [1×1 struct] Statistics: [2×7 table]

量化神经网络的性能研究

显示量化网络的精度。

prediction_simulation.MetricResults.Result
ans =2×2表NetworkImplementation MetricOutput  _____________________ ____________ {' 浮点}{“量子化”}1
prediction_FPGA.MetricResults.Result
ans =2×2表NetworkImplementation MetricOutput  _____________________ ____________ {' 浮点}{“量子化”}1

以每秒帧数显示量化网络的性能。

prediction_FPGA.Statistics.FramesPerSecond (2)
Ans = 19.0828

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

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

deepNetworkQuantizer

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

Deep Network Quantizer导入dlquantizer对象

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

选择要导入的dlquantizer对象

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

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

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

这个例子展示了如何在MATLAB中创建一个目标不可知的、可模拟的量化深度神经网络。

目标不可知量化允许你在没有目标硬件或目标特定量化方案的情况下看到量化对神经网络的影响。创建一个目标不可知的量化网络是有用的,如果你:

  • 无法访问目标硬件。

  • 想要预览您的网络是否适合量化。

  • 想要找到对量化敏感的层。

量化网络为量化兼容层模拟量化行为。网络体系结构(如层和连接)与原始网络相同,但推理行为使用有限的精度类型。一旦你量化了你的网络,你可以使用quantizationDetails函数来检索被量化的细节。

加载预训练的网络。是一个SqueezeNet网络,已经使用迁移学习重新训练,以分类图像在MerchData数据集。

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

您可以使用quantizationDetails函数查看网络是否被量化。

qdetailsorigoriginal = quantizationDetails(net)
qDetailsOriginal =带字段的结构:IsQuantized: 0 TargetLibrary: "" QuantizedLayerNames: [0×0 string] QuantizedLearnables: [0×3 table]

解压缩并加载MerchData图像作为图像数据存储。

解压缩(“MerchData.zip”imds = imageDatastore(“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

定义用于量化的校准和验证数据。图像的输出尺寸根据网络的要求改变校准和验证数据。

[calData,valData] = splitEachLabel(imds,0.7,“随机”);augCalData = augmentedImageDatastore([227 227],calData);augValData = augmentedImageDatastore([227 227],valData);

创建dlquantizer对象并指定要量化的网络。设置执行环境为MATLAB。网络如何量化取决于执行环境。MATLAB执行环境与目标硬件无关,并允许您对量化的行为进行原型化。

quantObj = dlquantizer(net,“ExecutionEnvironment”MATLAB的);

使用校准使用样本输入练习网络并收集距离信息的功能。的校准函数对网络进行练习,并收集网络的卷积层和全连接层中权重和偏差的动态范围,以及网络各层中激活的动态范围。函数返回一个表。表的每一行都包含优化网络的一个可学习参数的范围信息。

calResults = calibrate(quantObj,augCalData);

使用数字转换方法量化网络对象并返回可模拟的量化网络。

qNet = quantize(quantObj)
qNet =带有属性的量化DAGNetwork: Layers: [68×1 nnet.cnn.layer.Layer] Connections: [75×2 table] InputNames: {'data'} OutputNames: {'new_classoutput'}使用quantizationDetails方法提取量化细节。

您可以使用quantizationDetails函数查看网络现在是量化的。

qDetailsQuantized =量化细节(qNet)
qDetailsQuantized =带字段的结构:IsQuantized: 1 TargetLibrary: "none" QuantizedLayerNames: [26×1 string] QuantizedLearnables: [52×3 table]

使用原始的单精度浮点网络和量化的INT8网络进行预测。

predOriginal = classification (net,augValData);%非量化网络的预测predQuantized = classification (qNet,augValData);%量化网络的预测

计算量化网络相对于原始网络的相对精度。

ccrQuantized = mean(predQuantized == valData.Labels)*100
ccrQuantized = 100
ccrOriginal = mean(predOriginal == valData.Labels)*100
ccrOriginal = 100

对于这个验证数据集,量化网络给出了与浮点网络相同的预测。

版本历史

R2020a中引入

全部展开