主要内容

数字转换残余网络训练图像分类和生成CUDA代码

这个例子展示了如何在卷积数字转换可学的参数层的深度学习神经网络剩余连接和与CIFAR-10数据已经训练图像分类。

神经网络使用内存来存储输入数据,参数(权重),激活每一层的输入通过网络传播。您创建的大多数神经网络和训练使用深度学习工具箱™使用单精度浮点数据类型。即使是很小的网络需要大量的内存和硬件来执行这些浮点算术运算。这些限制可以抑制部署深度学习模型的设备计算能力低和更少的内存资源。通过使用低精度存储重量和激活,你可以减少网络的内存需求。

在本例中,您使用深度学习工具箱与深度学习工具箱串联模型量化库支持包减少内存占用的深层神经网络通过量化权重,偏见,和激活卷积层8位整数数据类型。万博1manbetx

网络在这个例子已经训练了图像分类与CIFAR-10数据。

剩余连接卷积神经网络架构的流行元素。剩余网络是一种DAG网络剩余(或快捷方式)连接,绕过主网络层。剩余连接启用参数梯度更容易传播的早些时候从输出层到层网络,这使得它可以更深层次的网络训练。这增加了网络深度会导致更高的精度更困难的任务。信息网络体系结构和培训,请参阅火车残余网络图像分类

要运行这个示例,您必须有数字转换所需的产品深入学习网络,并将其部署到一个GPUs manbetx 845的环境。关于这些产品的信息,请参阅s manbetx 845量化工作流先决条件

负载Pretrained网络

加载pretrained网络。对残留信息创建和训练一个网络连接图像分类自己,看到的火车残余网络图像分类的例子。

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

您可以使用analyzeNetwork分析深入学习网络架构。

analyzeNetwork(净)

trainedNet_Deep_Learning_Network_Analyzer.png

加载数据

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

datadir = tempdir;downloadCIFARData (datadir);
下载CIFAR-10数据集(175 MB)。这可能需要一段时间……。

准备校准和验证数据

加载CIFAR-10训练和测试图像4 - d数组。训练集包含50000张图片和测试集包含10000张图片。使用CIFAR-10测试图像网络验证。

[XTrain, YTrain XValidation YValidation] = loadCIFARData (datadir);

你可以显示一个随机样本的训练图像使用以下代码。

图;idx = randperm(大小(XTrain, 4), 20);我= imtile (XTrain (:,:,:, idx),“ThumbnailSize”(96、96));imshow (im)

创建一个augmentedImageDatastore对象用于校准和验证。使用200随机图像校准和50个随机图像进行验证。

inputSize = net.Layers (1) .InputSize;augimdsTrain = augmentedImageDatastore (inputSize XTrain YTrain);augimdsCalibration = shuffle (augimdsTrain) .subset (1:200);augimdsValidation = augmentedImageDatastore (inputSize XValidation YValidation);augimdsValidation = shuffle (augimdsValidation) .subset (1:50);

数字转换为GPU部署网络使用深层网络量化器应用程序

这个示例使用GPU执行环境。了解数字转换所需的产品深入学习网络,并s manbetx 845将其部署到GPU环境中,明白了量化工作流先决条件

在MATLAB®命令窗口,打开深层网络量化器的应用。

deepNetworkQuantizer

选择New >数字转换网络。应用程序自动验证您的执行环境。

在对话框中,选择执行环境和网络数字转换的基础工作。对于这个示例,选择一个GPU执行环境和DAG网络

校准将来发布的部分校准数据,选择augmentedImageDatastore从包含校准的基本工作空间数据对象augimdsCalibration

点击校准

深层网络行使网络量化器使用校准数据和信息收集范围可学的参数在网络层。

校准完成后,应用程序将显示一个表包含卷积的重量和偏见,以及网络和动态范围的完全连接层的激活所有层网络的最小和最大值在校准。右边的表,应用程序显示的动态范围参数的直方图。灰色区域的直方图显示的数据不能代表的量化表示。如何解释这些直方图的更多信息,参见量子化的神经网络

DNQ_CIFAR10_Calibrate.png

数字转换层列的表,指示是否可学的参数进行量化在层。层不卷积层不能量化的,因此不能被选中。层没有量化的量化后留在单精度。

验证将来发布的部分验证数据,选择augmentedImageDatastore从基本工作空间包含验证数据对象,augimdsValidation

验证将来发布的部分量化的选择,选择度量函数用于验证。应用程序决定了一个默认度量函数用于验证数字转换的基于网络的类型。您还可以添加额外的自定义度量函数用于验证。对于这个示例,输入自定义度量函数的名称hComputeAccuracy。选择添加添加hComputeAccuracy可用的指标函数列表的应用程序,选择hComputeAccuracy为验证度量函数来使用。这个自定义度量函数比较预测标签地面真理并返回(精度。自定义指标函数必须的道路上。

DNQ_CIFAR10_QuantizationOptions_hComputeAccuracy.png

点击数字转换和验证

应用数字转换网络并显示验证结果的总结。校准和验证的这组图片,网络结果的量化精度下降了2%,减少了73%可学的参数记忆的50集验证图像。

DNQ_CIFAR10_ValidationResults.png

量化和验证网络后,可以导出网络或生成代码。出口网络,选择出口>出口量化器创建一个dlquantizer对象的基本工作空间。打开GPU编码器应用和生成GPU代码优化神经网络,选择出口>生成代码。学习如何生成一个优化的CUDA代码深卷积神经网络使用GPU编码器,明白了生成INT8代码深入学习网络(GPU编码器)

验证使用多个网络的性能指标函数

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

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

创建一个dlquantizer对象。指定网络数字转换和要使用的执行环境。使用校准功能锻炼与样本输入网络augimdsCalibration范围和收集信息。

dq = dlquantizer(网络,“ExecutionEnvironment”,“图形”);augimdsCalibration calResults =校准(dq)

在一个指定的度量函数dlquantizationOptions对象。使用验证函数可学的参数进行量化在卷积网络和锻炼网络层。的验证函数使用度量函数中定义dlquantizationOptions对象比较网络量化前后的结果。对于这个示例,使用(准确性和前5精度指标用于评估网络的性能。

dqOpts = dlquantizationOptions (“MetricFcn”,{@ (x) hComputeAccuracy (x,净,augimdsValidation),@ (x) hComputeTop_5 (x,净,augimdsValidation)});validationResults =验证(dq、augimdsValidation dqOpts)
validationResults =结构体字段:NumSamples: 50 MetricResults:[1×2结构)统计:(2×2表)

检查MetricResults.Result验证输出领域看到的性能优化的网络以每个度量函数使用。

validationResults.MetricResults。结果validationResults.Statistics

校准数据形象化,首先保存dlquantizer对象dq。

保存(“dlquantObj.mat”,“dq”)

然后导入dlquantizer对象dq在深层网络量化器应用程序通过选择New >进口dlquantizer对象

生成CUDA代码

生成CUDA®代码优化深卷积神经网络。

创建入口点函数

写一个入口点函数在MATLAB®的说法:

  1. 使用coder.loadDeepLearningNetwork(GPU编码器)函数加载一个深度学习模型和构造和设置一个CNN类。有关更多信息,请参见负载Pretrained网络代码生成(GPU编码器)

  2. 调用预测预测的响应。

类型(“mynet_predict.m”);
函数= mynet_predict (netFile, im)持续净;如果isempty(净)净= coder.loadDeepLearningNetwork (netFile);结束= net.predict (im);结束

一个持久化对象mynet加载DAGNetwork对象。第一次调用的入口点函数构造和设置持久对象。后续调用函数重用相同的对象来调用预测在输入,避免重建并重新加载网络对象。

代码生成通过使用codegen

等配置构建设置输出文件名称、位置和类型,您将创建编码器配置对象。创建对象,使用coder.gpuConfig函数。例如,当使用codegen命令,生成CUDA墨西哥人使用cfg = coder.gpuConfig(墨西哥人)

为cuDNN指定代码生成参数,设置DeepLearningConfig属性到一个coder.CuDNNConfig使用您创建的对象coder.DeepLearningConfig

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

指定精度的推理计算通过使用支持层万博1manbetx数据类型财产。8位整数,使用“int8”。Int8精度需要CUDA GPU计算能力为6.1,6.3,或更高。使用ComputeCapabilityGPU代码配置对象的属性值设置适当的计算能力。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);cfg.DeepLearningConfig。数据类型=“int8”;cfg.DeepLearningConfig。CalibrationResultFile =“dlquantObj.mat”;netFile =“mynet.mat”;保存(netFile,“净”);

运行codegen命令。的codegen命令生成CUDA代码的mynet_predict.m入口点函数。

codegen配置cfgmynet_predictarg游戏{coder.Constant (netFile)的(inputSize '单')}报告

当代码生成成功,您可以查看生成的代码生成报告通过单击视图报告在MATLAB命令窗口。该报告是在报告中查看器显示窗口。如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。看到代码生成报告(MATLAB编码器)

Code_Generation_Successful.png

引用

[1]Krizhevsky,亚历克斯。2009。“学习的多层功能从微小的图像。”https://www.cs.toronto.edu/ kriz /学习- - 2009 tr.pdf特性

另请参阅

应用程序

功能

相关的话题