使用PARFOR到列车多深学习网络

这个例子说明了如何使用PARFOR循环执行在训练选项参数扫描。

深学习培训往往需要数小时或数天,并寻找良好的培训方案是很困难的。随着并行计算,可以加快和自动化的好的模式搜索。如果你有机会与多个图形处理单元(GPU)的计算机,可以对数据集的本地副本与当地parpool完成这个例子。如果您想使用更多的资源,你可以扩展深度学习培训到云中。这个例子说明了如何使用PARFOR循环对培训选项执行参数扫描MiniBatchSize在云中的一个簇。您可以修改脚本做任何其他培训选项参数扫描。此外,这个例子说明了如何计算期间使用获得从工人反馈DataQueue。您还可以发送脚本作为批处理作业到集群,这样你就可以继续工作或关闭MATLAB和以后获取结果。欲了解更多信息,请参阅将深度学习批处理任务发送到集群(深度学习工具箱)。

要求

在可以运行这个例子,你需要配置群集和上传数据到云中。在MATLAB中,你可以创建直接从MATLAB桌面的云团。在选项卡,在平行菜单中选择创建和管理集群。在集群概要管理器中,单击创建云团。或者,您可以使用MathWorks云中心来创建和访问计算集群。欲了解更多信息,请参阅开始使用云计算中心。在这个例子中,请确保您的群集被设置为默认的MATLAB选项卡,在平行>选择一个默认的集群。在此之后,上传数据到Amazon S3的桶和直接使用它从MATLAB。本示例使用已经存储在亚马逊S3的CIFAR-10的数据集的副本。有关说明,请参阅上传深入学习数据到云(深度学习工具箱)。

加载数据集从云

使用来自云加载训练和测试数据集imageDatastore。拆分训练数据集为训练和验证集,并保持测试数据集,以测试从参数扫描最好的网络。在这个例子中,你使用CIFAR-10数据的副本集存储在亚马逊S3。为了保证工人能够在云中的数据存储,确保为AWS凭据的环境变量设置正确。看到上传深入学习数据到云(深度学习工具箱)。

IMDS = 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控制的过滤器中的卷积块的数目层= [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];

培养几个网络上同时

指定要在其上执行参数扫描的小批处理大小。为最终的网络和准确性分配变量。

minibatchsize = [64 128 256 512];numMiniBatchSizes =元素个数(miniBatchSizes);trainedNetworks =细胞(numMiniBatchSizes, 1);精度= 0 (numMiniBatchSizes, 1);

执行并行参数扫描训练里面几个网络PARFOR循环和不同的小批量大小。集群中的工人同时训练网络和发送的培训网络,培训完成后精度回来。如果你想检查培训工作,集详细真正的在培训选项。需要注意的是工人独立地计算,所以在命令行输出不是在同一顺序的迭代。

PARFORIDX = 1:numMiniBatchSizes miniBatchSize = miniBatchSizes(IDX);initialLearnRate = 1E-1 * miniBatchSize / 256;%根据小批量大小缩放学习率。%定义培训选项。将小批量大小。选项= trainingOptions('SGDM'...'MiniBatchSize',miniBatchSize,...%的扫描设置相应的MiniBatchSize。“放牧”假的,...%不发送命令行输出。'InitialLearnRate',initialLearnRate,...%设置缩放学习率。'L2Regularization',1E-10,...'MaxEpochs'30岁的...“洗牌”“every-epoch”...'ValidationData',imdsValidation,...'LearnRateSchedule'“分段”...'LearnRateDropFactor',0.1%,...'LearnRateDropPeriod',25);%训练网络在集群中的工人。网= trainNetwork (augmentedImdsTrain层,选项);%为了获得该网络的精度,使用的培训网络%分类的工人的验证图像,并比较预测标签的%实际标签。YPredicted =分类(净,imdsValidation);精度(IDX)=总和(YPredicted == imdsValidation.Labels)/ numel(imdsValidation.Labels);%发送训练有素的网络返回给客户端。trainedNetworks {IDX} =净;结束
使用“MyClusterInTheCloud”配置文件启动并行池(parpool)…连接到并行池(worker数量: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(accur精确度);bestNetwork = trainedNetworks{我(1)};YPredicted =分类(bestNetwork imdsTest);精度= sum(YPredicted == imdste . labels)/numel(imdste . labels)
精度= 0.8173

发送反馈数据训练期间

准备和初始化图,显示在每个工人的训练进度。用animatedLine方便地显示变化的数据。

F =图。f.Visible = TRUE;对于i = 1:4次要情节(2,2,我)包含(“迭代”);ylabel(“训练精度”);线(I)= animatedline;结束

通过使用从工人的培训进度数据发送到客户端DataQueue,然后绘制数据。更新该地块每次发工人使用训练进度反馈afterEach。参数OPTS包含有关工作人员,培训迭代和训练精度的信息。

d = parallel.pool.DataQueue;afterEach(d,@(OPTS)updatePlot(线,OPTS {:}));

执行并行参数扫描训练几个网络与不同的小批量一个PARFOR循环中。使用注意事项OutputFcn在培训方式发送训练进度,客户每次迭代。该图显示了下面的代码的执行过程中四个不同的工作人员的训练进度。

PARFORIDX = 1:numel(miniBatchSizes)miniBatchSize = miniBatchSizes(IDX);initialLearnRate = 1E-1 * miniBatchSize / 256;%根据miniBatchSize缩放学习率。%定义培训选项。设置输出功能,将数据发送回%至客户端的每个迭代。选项= trainingOptions('SGDM'...'MiniBatchSize',miniBatchSize,...%的扫描设置相应的MiniBatchSize。“放牧”假的,...%不发送命令行输出。'InitialLearnRate',initialLearnRate,...%设置缩放学习率。'OutputFcn',@(状态)sendTrainingProgress(d,IDX,状态),...%设定的输出函数发送中间结果到客户端。'L2Regularization',1E-10,...'MaxEpochs'30岁的...“洗牌”“every-epoch”...'ValidationData',imdsValidation,...'LearnRateSchedule'“分段”...'LearnRateDropFactor',0.1%,...'LearnRateDropPeriod',25);%训练网络在集群中的工人。工人们发在培训期间向客户提供培训进度信息。网= trainNetwork (augmentedImdsTrain层,选项);%为了获得该网络的精度,使用的培训网络%分类的工人的验证图像,并比较预测标签的%实际标签。YPredicted =分类(净,imdsValidation);精度(IDX)=总和(YPredicted == 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(accur精确度);bestNetwork = trainedNetworks{我(1)};YPredicted =分类(bestNetwork imdsTest);精度= sum(YPredicted == imdste . labels)/numel(imdste . labels)
精度= 0.8187

辅助函数

定义一个函数来创建在所述网络体系结构的卷积块。

功能层= convolutionalBlock(numFilters,numConvLayers)层= [convolution2dLayer(3,numFilters,'填充'“相同”)批量标准化层reluLayer [;层= repmat(层numConvLayers 1);结束

定义一个函数,通过发送训练进度到客户端DataQueue

功能sendTrainingProgress (D, idx信息)如果info.State ==“迭代”发送(d,{IDX,info.Iteration,info.TrainingAccuracy});结束结束

定义一个更新功能当工人将中间结果来更新图。

功能updatePlot(线,IDX,ITER,ACC)addpoints(行(IDX),ITER,ACC);的DrawNowlimitratenocallbacks结束

也可以看看

||

相关的例子

更多关于