主要内容

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

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

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

需求

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

从云加载数据集

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

imds=图像数据存储(“s3://cifar10cloud/cifar10/train”,...“IncludeSubfolders”是的,...“LabelSource”,“foldernames”);imdsTest = imageDatastore (s3: / / cifar10cloud / cifar10 /测试”,...“IncludeSubfolders”是的,...“LabelSource”,“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9);

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

imageSize=[32 32 3];pixelRange=[-4];imageAugmenter=imageDataAugmenter(...“RandXReflection”是的,...“RandXTranslation”,像素范围,...“RandYTranslation”, pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,...“数据增强”imageAugmenter,...“OutputSizeMode”,“randcrop”);

定义网络架构

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

imageSize = [32 32 3];netDepth = 2;%netDepth控制卷积块的深度netWidth=16;%netWidth控制卷积块中的滤波器数量layers=[imageInputLayer(imageSize)卷积块(netWidth,netDepth)MaxPoolig2dLayer(2,“大步走”2) convolutionalBlock (2 * netWidth netDepth) maxPooling2dLayer (2“大步走”,2)卷积块(4*netWidth,netDepth)平均池2层(8)完全连接层(10)softmaxLayer分类层];

同时训练多个网络

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

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

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

帕弗idx = 1: numminibatchsize minbatchsize = minbatchsize (idx);initialLearnRate = 1e-1 * miniBatchSize/256;%根据小批量大小缩放学习率。%定义培训选项。设置最小批量大小。选择= trainingOptions (“个”,...“MiniBatchSize”miniBatchSize,...%在扫描中设置相应的MiniBatchSize。“详细”假的,...%不发送命令行输出。“InitialLearnRate”,initialLearnRate,...%设置比例学习率。“L2规范化”1平台以及...“MaxEpochs”30岁的...“洗牌”,“every-epoch”,...“ValidationData”,imdsValidation,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”,0.1,...“LearnRateDropPeriod”,25);%在集群的一个worker中训练网络。网= trainNetwork (augmentedImdsTrain层,选项);%要获得该网络的精度,请使用经过训练的网络%对worker上的验证图像进行分类,并将预测的标签与%实际标签。YPredicted=分类(净,imdsValidation);准确度(idx)=总和(YPredicted==imdsValidation.Labels)/numel(imdsValidation.Labels);%将经过培训的网络发送回客户机。trainedNetworks {idx} =净;结束
使用myclusterincloud配置文件启动并行池(parpool)…连接到并行池(工作人员数量:4)。

之后帕弗完成后,培训网络包含工人培训的结果网络。显示培训过的网络及其精度。

培训网络
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);精度= sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
精度= 0.8173

在培训期间发送反馈数据

准备并初始化显示每个工人培训进度的图表。使用动画线以方便地显示更改的数据。

f =图;f.Visible = true;i = 1:4次要情节(2,2,我)包含(“迭代”);伊莱贝尔(“训练准确性”);线(i)=动画线;结束

通过使用,将工人的培训进度数据发送给客户数据队列,然后绘制数据。每次工人发送培训进度反馈时,使用更新图afterEach.参数选择包含关于工作人员、培训迭代和培训准确性的信息。

D=parallel.pool.DataQueue;在每次(D,@(opts)updatePlot(line,opts{:}))之后;

执行一个并行参数扫描训练几个网络在一个parfor循环不同的小批量大小。注意OutputFcn在培训选项中,在每次迭代中将培训进度发送给客户。该图显示了执行以下代码期间四个不同工作人员的培训进度。

帕弗idx=1:numel(miniBatchSize)miniBatchSize=miniBatchSize(idx);initialLearnRate=1e-1*miniBatchSize/256;%根据miniBatchSize缩放学习率。确定培训选项。设置一个输出函数来发送回数据%在每次迭代中向客户机发送消息。选择= trainingOptions (“个”,...“MiniBatchSize”miniBatchSize,...%在扫描中设置相应的MiniBatchSize。“详细”假的,...%不发送命令行输出。“InitialLearnRate”,initialLearnRate,...%设置比例学习率。“OutputFcn”,@(州)发送培训进度(D、idx、州),...%设置输出函数,将中间结果发送到客户端。“L2规范化”1平台以及...“MaxEpochs”30岁的...“洗牌”,“every-epoch”,...“ValidationData”,imdsValidation,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”,0.1,...“LearnRateDropPeriod”,25);%在群集中的工人中培训网络。工人发送%向客户提供培训过程中的培训进度信息。网= trainNetwork (augmentedImdsTrain层,选项);%要获得该网络的精度,请使用经过训练的网络%对worker上的验证图像进行分类,并将预测的标签与%实际标签。YPredicted=分类(净,imdsValidation);准确度(idx)=总和(YPredicted==imdsValidation.Labels)/numel(imdsValidation.Labels);%将经过培训的网络发送回客户机。trainedNetworks {idx} =净;结束
分析并将文件传输给工人…完成。

之后帕弗完成后,培训网络包含工人培训的结果网络。显示培训过的网络及其精度。

培训网络
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);精度= sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
精度= 0.8187

辅助函数

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

函数层=卷积块(numFilters,numConvLayers)层=[卷积2dlayer(3,numFilters,“填充”,“相同”) batchNormalizationLayer reluLayer];层= repmat(层numConvLayers 1);结束

定义一个函数,通过该函数向客户发送培训进度数据队列

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

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

函数updatePlot(lines,idx,iter,acc)添加点(lines(idx),iter,acc);drawnowlimitratenocallbacks结束

另见

||(深度学习工具箱)

相关实例

更多关于