图像分类残差网络量化训练并生成CUDA代码
这个例子展示了如何量化具有剩余连接的深度学习神经网络的卷积层中的可学习参数,并已使用CIFAR-10数据进行图像分类训练。
神经网络使用内存来存储输入数据、参数(权重)和来自每一层的激活,因为输入在网络中传播。使用深度学习工具箱™创建和训练的大多数神经网络都使用单精度浮点数据类型。即使是小型网络也需要相当数量的内存和硬件来执行这些浮点算术操作。这些限制可能会阻碍深度学习模型部署到计算能力低、内存资源较少的设备上。通过使用较低的精度来存储权重和激活,可以减少网络的内存需求。
在本例中,您将深度学习工具箱与深度学习工具箱模型量化库支持包一起使用,通过将卷积层的权重、偏差和激活量化为8位缩放整型数据类型来减少深度神经网络的内存占用。金宝app
本例中的网络已经使用CIFAR-10数据进行了图像分类训练。
残差连接是卷积神经网络体系结构中一个很受欢迎的元素。残余网络是一种DAG网络,它具有绕过主网络层的残余(或捷径)连接。剩余连接使参数梯度更容易从输出层传播到网络的早期层,这使得训练更深层次的网络成为可能。这种增加的网络深度可以在更困难的任务中获得更高的准确性。有关网络架构和培训的信息,请参见图像分类残差网络训练.
要运行此示例,您必须拥有量化深度学习网络并将其部署到GPU环境所需的产品。下载188bet金宝搏有关这些产品的信息,请参见下载188bet金宝搏量化流程.
负荷预训练网络
加载预训练的网络。有关创建和训练带有剩余连接的网络用于图像分类的信息,请参见图像分类残差网络训练.
负载(“cifarnet - 20 - 16. -垫”,“trainedNet”);net = trainedNet;
你可以使用analyzeNetwork
分析深度学习网络体系结构。
analyzeNetwork(净)
加载数据
通过执行下面的代码下载CIFAR-10数据集[1]。该数据集包含60,000张图像。每张图像大小为32x32,有三个颜色通道(RGB)。数据集的大小为175 MB。根据您的互联网连接,下载过程可能需要一些时间。
Datadir = tempdir;downloadCIFARData (datadir);
下载CIFAR-10数据集(175mb)。这要花点时间…搞定。
为校准和验证准备数据
将CIFAR-10训练和测试图像加载为4-D数组。训练集包含50,000张图像,测试集包含10,000张图像。使用CIFAR-10测试图像进行网络验证。
[XTrain,YTrain,XValidation,YValidation] = loadCIFARData(datadir);
您可以使用以下代码显示训练图像的随机样本。
图;idx = randperm(size(XTrain,4),20);im = imtile(XTrain(:,:,:,idx),“ThumbnailSize”(96、96));imshow (im)
创建一个augmentedImageDatastore
对象用于校准和验证。使用200张随机图像进行校准,50张随机图像进行验证。
inputSize = net.Layers(1).InputSize;augimdsTrain = augmentedimagedastore (inputSize,XTrain,YTrain);augimdcalibration = shuffle(augimdsTrain).子集(1:200);augimdsValidation = augmentedImageDatastore(inputSize,XValidation,YValidation);augimdsValidation = shuffle(augimdsValidation).子集(1:50);
使用深度网络量化器应用程序量化GPU部署的网络
本例使用GPU执行环境。要了解量化深度学习网络并将其部署到GP下载188bet金宝搏U环境所需的产品,请参见量化流程.
在MATLAB®命令窗口中,打开深度网络量化器应用程序。
deepNetworkQuantizer
选择新增>量化网络.应用程序会自动验证您的执行环境。
在对话框中,从基本工作空间中选择要量化的执行环境和网络。在本例中,选择GPU执行环境和DAG网络网
.
在校准部分的工具条,在下面校准数据,选择augmentedImageDatastore
包含校准数据的基本工作空间中的augimdsCalibration
.
点击校准.
深度网络量化器使用校准数据来训练网络,并为网络层中的可学习参数收集距离信息。
当校准完成时,应用程序会显示一个表格,其中包含卷积中的权重和偏差,以及完全连接的网络层,以及校准期间网络各层激活的动态范围及其最小值和最大值。在表格的右侧,应用程序显示了参数的动态范围的直方图。直方图的灰色区域表示不能用量化表示的数据。有关如何解释这些直方图的详细信息,请参见深度神经网络的量化.
在数字转换层表的列,表示是否量化该层中的可学习参数。不是卷积层的层不能量子化,因此不能被选择。未量化的层在量化后保持单精度。
在验证部分的工具条,在下面验证数据,选择augmentedImageDatastore
包含验证数据的基本工作区中的augimdsValidation
.
在验证部分的工具条,在下面量化的选择,选择要用于验证的度量函数。该应用程序根据量化的网络类型确定用于验证的默认度量函数。您还可以添加额外的自定义度量函数用于验证。对于本例,输入自定义度量函数的名称hComputeAccuracy
.选择添加添加hComputeAccuracy
到应用程序中可用的度量函数列表。选择hComputeAccuracy
作为用于验证的度量函数。这个自定义度量函数将预测的标签与地面真相进行比较,并返回前1的精度。自定义度量函数必须在路径上。
点击量化和验证.
该应用程序量化网络,并显示验证结果的摘要。对于这组校准和验证图像,网络量化导致50张验证图像集的准确性下降2%,可学习参数记忆减少73%。
对网络进行量化验证后,可以导出量化后的网络,也可以生成代码。如果需要导出量化网络,选择导出>导出量化器要创建dlquantizer
基本工作区中的对象。要打开GPU Coder应用程序并从量化神经网络生成GPU代码,请选择导出>生成代码.要了解如何使用GPU Coder为量化深度卷积神经网络生成CUDA代码,请参见量化深度学习网络的代码生成.
使用多个度量函数验证量化网络的性能
方法可以同时使用多个度量函数来评估量化网络的性能dlquantizer
函数。
首先,加载预先训练好的网络和数据,并准备数据进行校准和验证,如上所述。
创建一个dlquantizer
对象。指定要量化的网络和要使用的执行环境。使用校准
函数使用样本输入来练习网络augimdsCalibration
并收集距离信息。
Dq = dlquantizer(净,“ExecutionEnvironment”,“图形”);calResults = calibrate(dq, augimdcalibration)
calResults =72×5表优化层名称网络层名称可学的/激活MinValue MaxValue _________________________________ __________________ ________________________ _________ ________ {' convInp_reluInp_Weights’}{‘reluInp}“权重”-0.020545 - 0.01913{‘convInp_reluInp_Bias}{‘reluInp}“偏见”-0.54225 - 2.0243{‘S1U1_conv1_S1U1_relu1_Weights}{‘S1U1_relu1}“权重”-0.58949 - 0.5883{‘S1U1_conv1_S1U1_relu1_Bias}{‘S1U1_relu1}“偏见”-0.87623 - 1.9467{‘S1U1_conv2_relu11_Weights} {' relu11 '}"Weights" -0.58679 0.39988 {'S1U1_conv2_relu11_Bias'} {'relu11'} "Bias" -0.59824 1.8325 {'S1U2_conv1_S1U2_relu1_Bias'} {' s1u2_relu1_bias '}} "Weights" -0.29821 0.33049 {' s1u2_conv1_s1u2_relu12_weights '} {'relu12'} "Weights" -0.7149 0.48284 {'S1U2_conv2_relu12_Bias'} {'relu12'} "Bias" -0.84685 1.6346 {' s1u3_conv1_s1u3_relu3_bias '} {' s1u3_conv1_s1u3_relu3_bias '} "Weights" -0.16697 0.15356 {' s1u3_conv1_s1u2_relu1_bias '} {' s1u3_relu3_bias '} {' s1u3_relu3_relu1_bias '} {' s1u3_relu3_relu3_bias '} {' s1u3_relu3_relu3_bias '}} "Bias" -0.16697 0.15356 {' s1u3_conv1_s1u2_relu2_bias '} " s1u3_relu3_relu3_bias '}} "Bias"-1.3796 2.1583 {'S1U3_conv2_relu13_Weights'} {'relu13'} "Weights" -0.47026 0.60147 {'S1U3_conv2_relu13_Bias'} {'relu13'} "Bias" -1.0089 1.5606 {'S2U1_conv1_S2U1_relu1_Weights'} {' s2u1_relu1_relu1 '} "Weights" -0.14931 0.13792 {'S2U1_conv1_S2U1_relu1_Bias'} {' s2u1_relu1_relu1 '} "Bias" -1.8735 2.4623 \
在a中指定度量函数dlquantizationOptions
对象。使用验证
函数量化网络卷积层中的可学习参数,并对网络进行训练。的验证
函数中定义的度量函数dlquantizationOptions
对象来比较量化前后的网络结果。对于本例,使用top-1精度和top-5精度指标来评估网络的性能。
dqOpts = dlquantizationOptions(“MetricFcn”,...{@ (x) hComputeAccuracy (x,净,augimdsValidation),...@ (x) hComputeTop_5 (x,净,augimdsValidation)});validationResults = validate(dq,augimdsValidation,dqOpts)
validationResults =带字段的结构:NumSamples: 50 MetricResults: [1×2 struct] Statistics: [2×2 table]
检查MetricResults。结果
字段的验证输出,以查看量化网络所使用的每个度量函数所测量的性能。
validationResults.MetricResults.Result
ans =2×2表NetworkImplementation MetricOutput _____________________ ____________ {' 浮点}0.98 0.96{“量子化”}
ans =2×2表NetworkImplementation MetricOutput _____________________ ____________ {' 浮点}{“量子化”}1
validationResults。统计数据
ans =2×2表NetworkImplementation LearnableParameterMemory(字节 ) _____________________ _______________________________ {' 浮点}1.1113 e + 06{“量子化”}3.0057 e + 05
为了可视化校准统计信息,首先保存dlquantizer
对象dq。
保存(“dlquantObj.mat”,“dq”)
然后导入dlquantizer
对象dq
在深度网络量化器应用程序中选择新建>导入dlquantizer
对象.
生成CUDA代码
为量化深度卷积神经网络生成CUDA®代码。
创建入口点函数
在MATLAB®中编写一个入口点函数:
使用
coder.loadDeepLearningNetwork
函数来加载深度学习模型,并构造和设置CNN类。有关更多信息,请参见为代码生成加载预训练的网络.调用
预测
(深度学习工具箱)来预测反应。
类型(“mynet_predict.m”);
function out = mynet_predict(netFile, im)持久化网络;if isempty(net) net = code . loaddeeplearningnetwork (netFile);End out = net.predict(im);结束
持久对象mynet
加载DAGNetwork
对象。对入口点函数的第一个调用构造并设置持久对象。对该函数的后续调用重用要调用的相同对象预测
在输入时,避免重构和重新加载网络对象。
使用代码生成codegen
要配置生成设置(如输出文件名、位置和类型),需要创建编码器配置对象。要创建对象,使用coder.gpuConfig
函数。例如,当使用codegen命令生成CUDA MEX时,使用cfg = code . gpuconfig ('mex')
.
要为cuDNN指定代码生成参数,请设置DeepLearningConfig
属性。编码器。CuDNNConfig
创建的对象编码器。DeepLearningConfig
.
指定包含校准数据的MAT文件的位置。
方法指定受支持层中推理计算的精度金宝app数据类型
财产。对于8位整数,使用“int8”
.Int8精度要求CUDA GPU具有6.1、6.3或更高的计算能力。使用ComputeCapability
的属性gpuConfig
对象来设置适当的计算能力值。
cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);cfg.DeepLearningConfig.DataType =“int8”;cfg.DeepLearningConfig.CalibrationResultFile =“dlquantObj.mat”;netFile =“mynet.mat”;保存(netFile,“净”);
运行codegen
命令。的codegen
命令生成CUDA代码mynet_predict.m
入口点函数。
codegen配置cfgmynet_predictarg游戏{code . constant (netFile), ones(inputSize, 'single')}报告
代码生成成功后,在MATLAB命令窗口中单击“查看报告”即可查看生成的代码生成报告。报表显示在“报表查看器”窗口中。如果代码生成器在代码生成过程中检测到错误或警告,则报告将描述问题并提供到有问题的MATLAB代码的链接。看到代码生成报告.
参考文献
[1]亚历克斯·克里哲夫斯基,2009年。“从微小图像中学习多层特征。”https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
另请参阅
应用程序
功能
相关的话题
- 量化流程
- 图像分类残差网络训练
- 量化深度学习网络的代码生成(GPU编码器)