dlquantizer
描述
使用dlquantizer
对象通过将权重、偏差和激活量化为8位缩放整数数据类型来降低深度神经网络的内存需求。您可以为GPU、FPGA、CPU部署创建和验证量化网络的行为,或在MATLAB中探索量化网络®.
对于CPU和GPU部署,该软件通过将卷积层的权重、偏差和激活量化为8位缩放整数数据类型,为卷积深度神经网络生成代码。量化是通过提供校准结果文件产生的校准
函数codegen
(MATLAB编码器)命令。
代码生成不支持量化深度神经网络生成金宝app数字转换
函数。
该对象要求深度学习工具箱模型量化库.要了解量化深度神经网络所需的产品,请参下载188bet金宝搏见量化流程.
创建
描述
输入参数
网
- - - - - -预训练神经网络
DAGNetwork
对象|dlnetwork
对象|SeriesNetwork
对象|yolov2ObjectDetector
对象|yolov3ObjectDetector
对象|yolov4ObjectDetector
对象|ssdObjectDetector
对象
预训练的神经网络,指定为DAGNetwork
,dlnetwork
,SeriesNetwork
,yolov2ObjectDetector
(计算机视觉工具箱),yolov3ObjectDetector
(计算机视觉工具箱),yolov4ObjectDetector
(计算机视觉工具箱),或ssdObjectDetector
(计算机视觉工具箱)对象。
属性
NetworkObject
- - - - - -预训练神经网络
DAGNetwork
对象|dlnetwork
对象|SeriesNetwork
对象|yolov2ObjectDetector
对象|yolov3ObjectDetector
|yolov4ObjectDetector
|ssdObjectDetector
对象
此属性是只读的。
预训练神经网络,指定为DAGNetwork
,dlnetwork
,SeriesNetwork
,yolov2ObjectDetector
(计算机视觉工具箱),yolov3ObjectDetector
(计算机视觉工具箱),yolov4ObjectDetector
(计算机视觉工具箱),或ssdObjectDetector
(计算机视觉工具箱)对象。
ExecutionEnvironment
- - - - - -执行环境
“图形”
(默认)|FPGA的
|“CPU”
|MATLAB的
量化网络的执行环境,指定为“图形”
,FPGA的
,“CPU”
,或MATLAB的
.网络如何量化取决于执行环境的选择。
的MATLAB的
执行环境表明将执行神经网络的目标不可知量化。这个选项不要求您有目标硬件,以便在MATLAB中探索量化网络。
例子:“ExecutionEnvironment”
,FPGA的
模拟
- - - - - -通过仿真验证FPGA环境下网络量化的行为
“关闭”
(默认)|“上”
是否使用仿真验证网络量化的FPGA行为,指定为以下值之一:
“上”
-通过在MATLAB中模拟量化网络,并将原始单精度网络的预测结果与量化网络的模拟预测结果进行比较,验证量化网络的行为。“关闭”
-生成代码并在目标硬件上验证量化网络的行为。
请注意
此选项仅在以下情况下有效ExecutionEnvironment设置为FPGA的
.
请注意
或者,您可以使用数字转换
方法来创建一个可模拟的量化网络。可模拟的量化网络能够可见网络的量化层、权重和偏差,以及可模拟的量化推理行为。
例子:“模拟”
,“上”
例子
GPU目标的神经网络量化
这个例子展示了如何量化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目标的神经网络
这个例子展示了如何量化和验证一个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{“量子化”}
FPGA部署的量化网络
通过将卷积层的权重、偏差和激活量化为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
对象进入深度网络量化器应用程序
此示例向您展示如何导入dlquantizer
对象从基本工作区转移到深度网络量化器这允许您使用命令行或应用程序开始量化深度神经网络,并在应用程序中稍后恢复您的工作。
打开深度网络量化器应用程序。
deepNetworkQuantizer
在应用程序中,单击新并选择导入dlquantizer对象
.
在对话框中,选择dlquantizer
要从基本工作区导入的对象。对于本例,使用quantObj
你在上面的例子中创建的量化GPU目标的神经网络。
应用程序导入包含在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中引入R2023a:dlnetwork
金宝app
dlquantizer
现在支持金宝appdlnetwork
对象进行量化数字转换
函数。
R2023a:数字转换yolov3ObjectDetector
而且yolov4ObjectDetector
使用dlquantizer
yolov3ObjectDetector
(计算机视觉工具箱)而且yolov4ObjectDetector
(计算机视觉工具箱)对象现在可以使用量子化dlquantizer
.
R2022b:dlnetwork
金宝app
dlquantizer
现在支持金宝appdlnetwork
对象进行量化校准
而且验证
功能。
R2022a:针对CPU目标,验证量化网络的性能
您现在可以使用dlquantizer
对象和验证
函数来量化网络并为CPU目标生成代码。
R2022a:量化没有特定目标的神经网络
指定MATLAB
随着ExecutionEnvironment
量化你的神经网络,而不生成代码或提交到特定的目标代码部署。如果你:
无法访问目标硬件。
希望在不生成代码的情况下检查量化网络。
您的量化网络实现int8
数据代替单
数据。它保持与原始网络相同的层和连接,并且具有与在硬件上运行时相同的推断行为。
一旦你量化了你的网络,你可以使用quantizationDetails
函数检查量化网络。此外,您还可以选择将代码部署到GPU目标。
另请参阅
应用程序
功能
主题
- 深度神经网络的量化
- 图像分类残差网络量化训练并生成CUDA代码
- 量化层在对象检测器和生成CUDA代码
- FPGA部署的量化网络(深度学习HDL工具箱)
- 在树莓派上生成深度学习网络INT8代码(MATLAB编码器)
- 图像分类网络的参数剪枝与量化
Matlab명령
다음matlab명령에해당하는링크를클릭했습니다。
명령을실행하려면matlab명령창에입력하십시오。웹브라우저는matlab명령을지원하지않습니다。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。