主要内容

使用自动多gpu支持训练网络

这个例子展示了如何使用自动并行支持在本地机器上使用多个gpu进行深度学习训练。

训练深度学习网络通常需要数小时或数天。通过并行计算,您可以使用多个gpu加速训练。要了解关于并行训练选项的更多信息,请参见在并行、gpu和云上扩展深度学习

需求

在运行此示例之前,必须将CIFAR-10数据集下载到本地计算机。要下载CIFAR-10数据集,请使用downloadCIFARToFolders函数,作为支持文件附加到本示例中。要访问此文件,请将示例作为实时脚本打开。下面的代码将数据集下载到当前目录。如果您已经有了CIFAR-10的本地副本,那么您可以跳过本节。

目录= pwd;[locationCifar10Train, locationCifar10Test] = downloadCIFARToFolders(目录);
下载CIFAR-10数据集…完成。复制CIFAR-10到文件夹…完成。

加载数据集

方法加载训练和测试数据集imageDatastore对象。在下面的代码中,确保数据存储的位置指向本地机器中的CIFAR-10。

imdsTrain = imageDatastore (locationCifar10Train,...IncludeSubfolders = true,...LabelSource =“foldernames”);imdsTest = imageDatastore (locationCifar10Test,...IncludeSubfolders = true,...LabelSource =“foldernames”);

要用增强的图像数据训练网络,可以创建一个augmentedImageDatastore对象。使用随机平移和水平反射。数据增强有助于防止网络过拟合和记忆训练图像的精确细节。

imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...RandXReflection = true,...RandXTranslation = pixelRange,...RandYTranslation = pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,...DataAugmentation = imageAugmenter);

定义网络架构和培训选项

为CIFAR-10数据集定义网络体系结构。为了简化代码,可以使用卷积块对输入进行卷积。池化层向下采样空间维度。

blockDepth = 4;blockDepth控制卷积块的深度。netWidth = 32;% netWidth控制卷积块中过滤器的数量。layers = [imageInputLayer(imageSize) convolutionalBlock(netWidth,blockDepth) maxPooling2dLayer(2,Stride=2) convolutionalBlock(2*netWidth,blockDepth) maxPooling2dLayer(2,Stride=2) convolutionalBlock(4*netWidth,blockDepth) averagePooling2dLayer(8) fulllyconnectedlayer (10) softmaxLayer classificationLayer];

定义培训选项。通过设置执行环境为,并行训练多个gpu的网络multi-gpu.当您使用多个gpu时,您将增加可用的计算资源。根据GPU的数量扩大迷你批处理的大小,以保持每个GPU上的工作负载不变。本例中,gpu的个数为4。根据小批量大小调整学习率。使用学习率计划来随着训练的进行降低学习率。打开训练进度图,在训练过程中获得视觉反馈。

numGPUs = gpuDeviceCount (“可用”
numGPUs = 4
miniBatchSize = 256 * numGPUs;initialLearnRate = 1 e 1 * miniBatchSize / 256;选择= trainingOptions (“个”...ExecutionEnvironment =“multi-gpu”...打开自动多gpu支持。InitialLearnRate = InitialLearnRate,...设置初始学习率。MiniBatchSize = MiniBatchSize,...%设置MiniBatchSize。Verbose = false,...不发送命令行输出。情节=“训练进步”...打开训练进度图。。L2Regularization = 1平台以及,...MaxEpochs = 60,...洗牌=“every-epoch”...ValidationData = imdsTest,...ValidationFrequency =地板(元素个数(imdsTrain.Files) / miniBatchSize),...LearnRateSchedule =“分段”...LearnRateDropFactor = 0.1,...LearnRateDropPeriod = 50);

列车网络及其分类用途

培训网络。在训练过程中,图形显示了进度。

净= trainNetwork (augmentedImdsTrain、层、期权)
使用“Processes”配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。

net = SeriesNetwork属性:Layers: [43×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}

通过使用经过训练的网络对本地机器上的测试图像进行分类,确定网络的准确性。然后将预测的标签与实际的标签进行比较。

YPredicted =分类(净,imdsTest);accuracy = sum(yexpected == imdste . labels)/numel(imdste . labels)
精度= 0.8972

自动多gpu支持可以利用多个gpu加速网络训练。下面的图显示了具有4个NVIDIA©TITAN Xp gpu的Linux机器上的gpu数量在总体训练时间中的加速。

定义辅助函数

定义一个函数在网络体系结构中创建卷积块。

函数layers = convolutionalBlock(numFilters,numConvLayers) layers =[卷积2dlayer (3,numFilters,Padding= .“相同”) batchNormalizationLayer reluLayer];层= repmat(层numConvLayers 1);结束

另请参阅

||

相关的话题

Baidu
map