主要内容

使用parfor训练多个深度学习网络

这个例子展示了如何使用parfor循环对训练选项执行参数扫描。

深度学习训练通常需要几个小时或几天的时间,寻找好的训练选项可能很困难。通过并行计算,您可以加快并自动搜索好的模型。如果您可以访问具有多个图形处理单元(gpu)的计算机,则可以使用本地解析池在数据集的本地副本上完成本示例。如果你想使用更多的资源,你可以将深度学习训练扩展到云端。这个例子展示了如何使用parfor循环对训练选项执行参数扫描MiniBatchSize在云端的集群中。您可以修改脚本以对任何其他训练选项执行参数扫描。此外,本例还展示了如何在计算使用过程中从worker获得反馈DataQueue.您还可以将脚本作为批处理作业发送到集群,以便您可以继续工作或关闭MATLAB并稍后获取结果。有关更多信息,请参见将深度学习批处理作业发送到集群

需求

在运行这个示例之前,您需要配置一个集群并将数据上传到云。在MATLAB中,您可以直接从MATLAB Desktop在云中创建集群。在首页选项卡,在平行菜单中,选择创建和管理集群.在“集群配置文件管理器”中,单击创建云集群.您也可以使用MathWorks Cloud Center创建和访问计算集群。有关更多信息,请参见开始使用云中心.对于本例,确保在MATLAB中将集群设置为默认值首页选项卡,在平行>选择默认集群.之后,将数据上传到Amazon S3桶,并直接从MATLAB中使用它。本示例使用已经存储在Amazon S3中的CIFAR-10数据集的副本。有关说明,请参见将深度学习数据上传到云端

从云端加载数据集

使用从云中加载训练和测试数据集imageDatastore.将训练数据集拆分为训练集和验证集,保留测试数据集,从参数扫描中测试最佳网络。在本例中,您使用存储在Amazon S3中的CIFAR-10数据集的副本。为了确保工作人员能够访问云中的数据存储,请确保正确设置AWS凭证的环境变量。看到将深度学习数据上传到云端

imds = imageDatastore(s3: / / cifar10cloud / cifar10 /火车'...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);imdsTest = imageDatastore(s3: / / cifar10cloud / cifar10 /测试”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);

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

imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augmentedImdsTrain = augmentedimagedastore (imageSize,imdsTrain,...“DataAugmentation”imageAugmenter,...“OutputSizeMode”“randcrop”);

定义网络架构

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

imageSize = [32 32 3];netDepth = 2;% netDepth控制卷积块的深度netWidth = 16;% netWidth控制卷积块中的过滤器数量图层= [imageInputLayer(imageSize) convolutionalBlock(netWidth,netDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(2* nettwidth,netDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(4*netWidth,netDepth) averagePooling2dLayer(8) fullyConnectedLayer(10) softmaxLayer classificationLayer];

同时训练多个网络

指定要对其执行参数扫描的小批大小。为结果网络和准确度分配变量。

miniBatchSizes = [64 128 256 512];numMiniBatchSizes = nummel (miniBatchSizes);trainedNetworks = cell(numMiniBatchSizes,1);精度= 0 (numMiniBatchSizes,1);

执行一个并行参数扫描训练多个网络在一个parfor循环和改变迷你批处理大小。集群中的工作人员同时训练网络,并在训练完成时将训练过的网络和准确度发回。如果您想检查培训是否有效,请设置详细的真正的在培训选项中。请注意,工作人员是独立计算的,因此命令行输出与迭代的顺序不同。

parforidx = 1:numMiniBatchSizes miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1e-1 * miniBatchSize/256;根据迷你批处理大小缩放学习率。定义培训选项。设置迷你批大小。选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...在扫描中设置相应的MiniBatchSize。“详细”假的,...不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置缩放学习率。“L2Regularization”1平台以及...“MaxEpochs”30岁的...“洗牌”“every-epoch”...“ValidationData”imdsValidation,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”25);在集群中的一个worker中训练网络。net = trainNetwork(augmentedImdsTrain,layers,options);%为了获得这个网络的准确性,使用训练过的网络对工人上的验证图像进行分类,并将预测的标签与标签进行比较%实际标签。ypredict =分类(net,imdsValidation);accuracies(idx) = sum(ypredict == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。trainedNetworks{idx} = net;结束
使用' myclusterincloud '配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。

parfor完成后,trainedNetworks包含由工作人员训练的结果网络。显示训练过的网络及其精度。

trainedNetworks
trainedNetworks =4×1单元格数组{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8188 0.8232 0.8162 0.8050

在准确性方面选择最佳网络。根据测试数据集测试其性能。

[~, I] = max(精度);bestNetwork = trainedNetworks{I(1)};ypredict = category (bestNetwork,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)
准确度= 0.8173

在培训期间发送反馈数据

准备并初始化显示每个工人的培训进度的图表。使用animatedLine以方便的方式显示变化的数据。

F =数字;f.可见=真实;I =1:4 subplot(2,2, I)“迭代”);ylabel (“训练的准确性”);Lines (i) = animatedline;结束

通过using将工人的培训进度数据发送给客户端DataQueue,然后绘制数据。每次工人通过使用发送培训进度反馈时更新图表afterEach.的参数选择包含关于worker、训练迭代和训练精度的信息。

D = parallel.pool.DataQueue;afterEach(D, @(opts) updatePlot(lines, opts{:}));

执行并行参数扫描训练parfor循环中具有不同迷你批处理大小的多个网络。注意使用OutputFcn在训练选项中向客户端发送每次迭代的训练进度。该图显示了在执行以下代码期间四个不同工作人员的培训进度。

parforidx = 1: nummel (miniBatchSizes) miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1e-1 * miniBatchSize/256;根据miniBatchSize缩放学习率。定义培训选项。设置输出函数将数据发回%传递给客户端。选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...在扫描中设置相应的MiniBatchSize。“详细”假的,...不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置缩放学习率。“OutputFcn”@(州)sendTrainingProgress (D idx状态),...设置输出函数,将中间结果发送到客户端。“L2Regularization”1平台以及...“MaxEpochs”30岁的...“洗牌”“every-epoch”...“ValidationData”imdsValidation,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”25);在集群中的一个worker中训练网络。工人们发送%培训进度信息,在培训期间向客户提供。net = trainNetwork(augmentedImdsTrain,layers,options);%为了获得这个网络的准确性,使用训练过的网络对工人上的验证图像进行分类,并将预测的标签与标签进行比较%实际标签。ypredict =分类(net,imdsValidation);accuracies(idx) = sum(ypredict == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。trainedNetworks{idx} = net;结束
分析文件并将文件传输给工作人员…完成。

parfor完成后,trainedNetworks包含由工作人员训练的结果网络。显示训练过的网络及其精度。

trainedNetworks
trainedNetworks =4×1单元格数组{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8214 0.8172 0.8132 0.8084

在准确性方面选择最佳网络。根据测试数据集测试其性能。

[~, I] = max(精度);bestNetwork = trainedNetworks{I(1)};ypredict = category (bestNetwork,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)
准确度= 0.8187

辅助函数

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

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

定义一个函数,通过该函数将培训进度发送给客户端DataQueue

函数sendTrainingProgress (D, idx信息)如果信息。状态= =“迭代”发送(D, {idx、info.Iteration info.TrainingAccuracy});结束结束

定义一个更新函数,在工作人员发送中间结果时更新图。

函数updatePlot(线、idx iter acc) addpoints(直线(idx)、iter acc);drawnowlimitratenocallbacks结束

另请参阅

|(并行计算工具箱)|

相关的例子

更多关于