主要内容

量化残差网络训练的图像分类和生成CUDA代码

这个例子展示了如何量化深度学习神经网络卷积层中的可学习参数,该神经网络具有残差连接,并经过CIFAR-10数据的图像分类训练。

当输入在网络中传播时,神经网络使用内存存储输入数据、参数(权重)和来自每一层的激活。使用深度学习工具箱™创建和训练的大多数神经网络都使用单精度浮点数据类型。即使是小型网络也需要大量的内存和硬件来执行这些浮点算术操作。这些限制可能会阻碍深度学习模型部署到计算能力较低、内存资源较少的设备上。通过使用较低的精度来存储权重和激活,可以减少网络的内存需求。

在本例中,您将联合使用深度学习工具箱和深度学习工具箱模型量化库支持包,通过将卷积层的权重、偏差和激活量化为8位缩放整数数据类型,来减少深度神经网络的内存占用。金宝app

本例中的网络经过训练,可以使用CIFAR-10数据进行图像分类。

残差连接是卷积神经网络体系结构中的一个流行元素。残余网络是DAG网络的一种类型,它具有绕过主网络层的残余(或捷径)连接。剩余连接使参数梯度更容易地从输出层传播到网络的早期层,这使得训练更深层次的网络成为可能。这种增加的网络深度可以在更困难的任务中产生更高的准确性。有关网络架构和培训的信息,请参见训练残差网络用于图像分类

要运行这个示例,您必须拥有量化深度学习网络并将其部署到GPU环境所需的产品。下载188bet金宝搏有关这些产品的信息,请参见下载188bet金宝搏量化工作流程

负载预训练网络

加载预训练的网络。有关如何创建和训练具有残余连接的网络,以便自己进行图像分类的信息,请参见训练残差网络用于图像分类

负载(“cifarnet - 20 - 16. -垫”“trainedNet”);net = trainedNet;

你可以用analyzeNetwork分析深度学习网络体系结构。

analyzeNetwork(净)

加载数据

通过执行下面的代码下载CIFAR-10数据集[1]。该数据集包含6万张图像。每张图片的尺寸是32x32,有三个颜色通道(RGB)。数据集的大小是175 MB。根据您的互联网连接,下载过程可能需要一些时间。

Datadir = tempdir;downloadCIFARData (datadir);
下载CIFAR-10数据集(175 MB)。这可能要花点时间,搞定。

为校准和验证准备数据

将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 = augmentedImageDatastore(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

点击校准

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

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

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

验证部分的工具条,下面验证数据,选择augmentedImageDatastore对象从包含验证数据的基本工作区中获取,augimdsValidation

验证部分的工具条,下面量化的选择,选择要用于验证的度量函数。该应用程序根据你量化的网络类型确定一个默认的度量函数用于验证。您还可以添加额外的自定义度量函数用于验证。对于本例,输入自定义度量函数的名称hComputeAccuracy.选择添加添加hComputeAccuracy到应用程序中可用的度量函数列表。选择hComputeAccuracy作为用于验证的度量函数。这个自定义度量函数将预测的标签与地面真相进行比较,并返回前1的精确度。自定义度量函数必须在路径上。

点击量化和验证

该应用程序对网络进行量化,并显示验证结果的摘要。对于这组校准和验证图像,网络的量化结果在50个验证图像的集合中准确性下降2%,可学习参数记忆减少73%。

在对网络进行量化和验证之后,可以导出量化后的网络或生成代码。要导出量化的网络,选择导出>导出量化器要创建一个dlquantizer对象。打开GPU Coder应用程序并从量化的神经网络生成GPU代码,选择导出>生成代码.要了解如何使用GPU Coder为量化深度卷积神经网络生成CUDA代码,请参见量化深度学习网络的代码生成

用多重度量函数验证量化网络的性能

可以使用多个度量函数来同时评估量化网络的性能dlquantizer函数。

首先,加载预先训练的网络和数据,并准备校准和验证的数据,如上所述。

创建一个dlquantizer对象。指定要量化的网络和要使用的执行环境。使用校准函数使用样本输入来练习网络augimdsCalibration并收集射程信息。

Dq = dlquantizer(net,“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 {'S1U2_conv1_S1U2_relu1_Bias'} {' s1u2_relu1_bias '} {' s1u2_relu1_bias '} "Weights" -0.59824 1.8325 {'S1U2_conv1_S1U2_relu1_Bias'} {' s1u2_relu1_bias '} {' s1u2_relu1_bias '} "Weights" -0.29821 0.33049 {'S1U2_conv1_S1U2_relu1_Bias'} {' s1u2_relu12_bias '} {'relu12'} "Weights" -0.7149 0.48284 {'S1U2_conv2_relu12_Bias'} {'relu12'} "Bias" -0.84685 1.6346 {'S1U3_conv1_S1U3_relu1_Bias'} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_bias '} {' s1u3_relu1_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_bias '} {' s2u1_relu1_bias '} "Bias" -0.14931 0.13792 {'S2U1_conv1_S2U1_relu1_Bias'} {' s2u1_relu1323 '} "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 metrics results: [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®中编写一个入口点函数:

  1. 使用coder.loadDeepLearningNetwork函数加载深度学习模型,构造并建立CNN类。有关更多信息,请参见为代码生成加载预先训练的网络

  2. 调用预测(深度学习工具箱)来预测响应。

类型(“mynet_predict.m”);
函数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 .gpu config ('mex')

要为cuDNN指定代码生成参数,请设置DeepLearningConfiga的财产编码器。CuDNNConfig对象创建的编码器。DeepLearningConfig

指定包含校准数据的MAT文件的位置。

方法指定受支持层中推理计算的精度金宝app数据类型财产。对于8位整数,使用“int8”.Int8精度要求CUDA GPU具有6.1、6.3或更高的计算能力。使用ComputeCapability的属性gpuConfig对象设置适当的计算能力值。

cfg = code .gpu config (墨西哥人的);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命令窗口中的view report查看生成的代码生成报告。报表显示在“报表查看器”窗口中。如果代码生成器在代码生成过程中检测到错误或警告,报告将描述问题并提供问题MATLAB代码的链接。看到代码生成报告

参考文献

亚历克斯·克里哲夫斯基,2009年。“从微小的图像中学习多层特征。”https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

另请参阅

应用程序

功能

相关的话题