主要内容

训练网络使用自动多gpu支持万博1manbetx

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

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

需求

在运行此示例之前,必须将CIFAR-10数据集下载到本地计算机。要下载CIFAR-10数据集,请使用downloadCIFARToFolders函数,作为支持文件附加到本示例中。万博1manbetx要访问此文件,请将示例作为活动脚本打开。下面的代码将数据集下载到当前目录。如果您已经有了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);augmentedImdsTrain = augmentedimagedastore (imageSize,imdsTrain,...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) fullyConnectedLayer(10) softmaxLayer classificationLayer];

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

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

列车网络和分类使用

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

net = trainNetwork(augmentedImdsTrain,layers,options)
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。

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

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

ypredict = category (net,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)
准确度= 0.8972

自动多gpu支持可以利用多个gpu来加速万博1manbetx网络训练。下图显示了在具有四个NVIDIA©TITAN Xp gpu的Linux机器上,随着gpu数量的增加,总体训练时间的加速。

定义Helper函数

定义一个函数,在网络架构中创建卷积块。

函数layers = convolutionalBlock(numFilters,numConvLayers) layers = [convolution2dLayer(3,numFilters,Padding= .“相同”) batchNormalizationLayer reluLayer;layers = repmat(layers,numConvLayers,1);结束

另请参阅

||

相关的话题