使用parfor训练多个深度学习网络
这个例子展示了如何使用parfor
循环对训练选项执行参数扫描。
深度学习训练通常需要数小时或数天的时间,寻找好的训练选项可能很困难。通过并行计算,您可以加速并自动化搜索好的模型。如果可以访问具有多个图形处理单元(gpu)的计算机,则可以使用本地解析池在数据集的本地副本上完成本例。如果你想使用更多的资源,你可以将深度学习培训扩展到云端。这个例子展示了如何使用parfor循环对训练选项执行参数扫描MiniBatchSize
在云中的一个集群中。您可以修改脚本,以便在任何其他训练选项上执行参数扫描。此外,本例还展示了如何在计算使用过程中获得工作者的反馈DataQueue
.您还可以将脚本作为批处理作业发送到集群,这样您就可以继续工作或关闭MATLAB并稍后获取结果。有关更多信息,请参见发送深度学习批作业到集群.
需求
在运行此示例之前,您需要配置一个集群并将数据上传到云端。在MATLAB中,您可以直接从MATLAB桌面在云中创建集群。在首页选项卡,平行菜单中,选择创建和管理集群.在“集群配置文件管理器”中,单击创建云计算集群.您也可以使用MathWorks Cloud Center创建和访问计算集群。有关更多信息,请参见云中心入门.对于本例,确保您的集群在MATLAB上被设置为默认值首页选项卡,在平行>选择默认集群.之后,将数据上传到Amazon S3桶中,并直接从MATLAB中使用它。本例使用已经存储在Amazon S3中的CIFAR-10数据集的副本。说明,请参阅上传深度学习数据到云端.
从云中加载数据集
使用从云中加载训练和测试数据集imageDatastore
.将训练数据集分成训练集和验证集,并保留测试数据集,从参数扫描中测试最佳网络。在本例中,您使用存储在Amazon S3中的CIFAR-10数据集的副本。为了确保工作人员能够访问云中的数据存储,请确保正确设置AWS凭据的环境变量。看到上传深度学习数据到云端.
imd = imageDatastore (s3: / / cifar10cloud / cifar10 /火车',...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);imdsTest = imageDatastore (s3: / / cifar10cloud / cifar10 /测试”,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);
用增强的图像数据训练网络augmentedImageDatastore
对象。使用随机平移和水平反射。数据增强有助于防止网络过拟合和记忆训练图像的精确细节。
imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,...“DataAugmentation”imageAugmenter,...“OutputSizeMode”,“randcrop”);
定义网络体系结构
为CIFAR-10数据集定义网络体系结构。为了简化代码,可以使用卷积块对输入进行卷积。池化层向下采样空间维度。
imageSize = [32 32 3];netDepth = 2;netDepth控制卷积块的深度netWidth = 16;% netWidth控制卷积块中过滤器的数量layers = [imageInputLayer(imageSize) convolutionalBlock(netWidth,netDepth) maxPooling2dLayer(2,“步”2) convolutionalBlock (2 * netWidth netDepth) maxPooling2dLayer (2“步”,2) convolutionalBlock(4*netWidth,netDepth) averagePooling2dLayer(8) fullyConnectedLayer(10) softmaxLayer classificationLayer];
同时训练多个网络
指定要对其进行参数扫描的小批大小。为结果网络和准确性分配变量。
miniBatchSizes = [64 128 256 512];numMiniBatchSizes =元素个数(miniBatchSizes);trainedNetworks =细胞(numMiniBatchSizes, 1);精度= 0 (numMiniBatchSizes, 1);
执行并行参数扫描,训练一个内部的多个网络parfor
循环和改变小批大小。集群中的工作人员同时对网络进行训练,并在训练完成后将训练过的网络和准确性发回。如果你想检查训练是否有效,设置详细的
来真正的
在培训选项中。注意,工作人员是独立计算的,因此命令行输出与迭代的顺序不同。
parforidx = 1:numMiniBatchSizes miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1 -1 * miniBatchSize/256;根据小批量大小调整学习率。定义培训选项。设置小批量大小。选择= trainingOptions (“个”,...“MiniBatchSize”miniBatchSize,...%在扫描中设置相应的MiniBatchSize。“详细”假的,...不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置缩放学习速率。“L2Regularization”1平台以及...“MaxEpochs”30岁的...“洗牌”,“every-epoch”,...“ValidationData”imdsValidation,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”25);在集群中的一个worker中培训网络。。网= trainNetwork (augmentedImdsTrain层,选项);%为了获得该网络的准确性,使用训练过的网络%对工作器上的验证图像进行分类,并将预测的标签与%实际标签。YPredicted =分类(净,imdsValidation);accuracies(idx) = sum(yexpected == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。。trainedNetworks {idx} =净;结束
使用“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{我(1)};YPredicted =分类(bestNetwork imdsTest);accuracy = sum(yexpected == imdste . labels)/numel(imdste . labels)
精度= 0.8173
在培训期间发送反馈数据
准备并初始化显示每个工人的培训进度的图。使用animatedLine
为了方便地显示变化的数据。
f =图;f.Visible = true;为i = 1:4次要情节(2,2,我)包含(“迭代”);ylabel (“训练的准确性”);行(i) = animatedline;结束
将工人的培训进度数据发送给客户端DataQueue
,然后绘制数据。每次员工通过使用发送培训进度反馈时更新图afterEach
.的参数选择
包含关于工作者、训练迭代和训练准确性的信息。
D = parallel.pool.DataQueue;afterEach(D, @(opts) updatePlot(lines, opts{:}));
执行并行参数扫描,训练parfor循环中具有不同小批大小的多个网络。注意的用法OutputFcn
在训练选项中,将每次迭代的训练进度发送给客户端。该图显示了在执行以下代码期间四个不同工作人员的培训进度。
parforidx = 1:numel(miniBatchSizes) miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1 -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中培训网络。。工人们把%在培训过程中向客户提供培训进度信息。网= trainNetwork (augmentedImdsTrain层,选项);%为了获得该网络的准确性,使用训练过的网络%对工作器上的验证图像进行分类,并将预测的标签与%实际标签。YPredicted =分类(净,imdsValidation);accuracies(idx) = sum(yexpected == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。。trainedNetworks {idx} =净;结束
分析和传送文件给工人…完成。
后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{我(1)};YPredicted =分类(bestNetwork imdsTest);accuracy = sum(yexpected == imdste . labels)/numel(imdste . labels)
精度= 0.8187
辅助函数
定义一个函数在网络体系结构中创建卷积块。
函数layers = convolutionalBlock(numFilters,numConvLayers) layers = [convolution2dLayer(3,numFilters,“填充”,“相同”;;;;层= repmat(层numConvLayers 1);结束
定义一个函数,通过它将培训进度发送给客户端DataQueue
.
函数sendTrainingProgress (D, idx信息)如果信息。状态= =“迭代”发送(D, {idx、info.Iteration info.TrainingAccuracy});结束结束
定义一个更新函数,以便在工作者发送中间结果时更新图。
函数updatePlot(线、idx iter acc) addpoints(直线(idx)、iter acc);drawnowlimitratenocallbacks结束
另请参阅
trainNetwork
|parallel.pool.DataQueue
(并行计算工具箱)|imageDatastore
相关的例子
更多关于
- 并行for循环(parfor)(并行计算工具箱)