主要内容

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

这个例子展示了如何使用parfeval执行一个参数对网络体系结构的深度扫描深度学习网络在训练和检索数据。

深度学习训练通常需要数小时或数天,寻找良好的架构是很困难的。使用并行计算,可以加快和自动化你的寻找好的模型。如果你有访问一台机器与多个图形处理单元(gpu),你可以完成这个示例数据集与当地的本地副本并行池。如果你想使用更多的资源,你可以扩大到云深学习培训。这个例子展示了如何使用parfeval执行参数扫描深度的网络体系结构在集群的云。使用parfeval允许你火车没有阻断MATLAB在后台,并提供选项停止早期的结果是令人满意的。您可以修改脚本参数扫描其他参数。同时,这个例子展示了如何获得在计算通过使用来自员工的反馈DataQueue

需求

在运行这个例子之前,您需要配置一个集群和上传数据到云上。在MATLAB中,您可以在云中创建集群直接从MATLAB桌面。在选项卡,平行菜单中,选择创建和管理集群。在集群配置文件管理器,单击创建云计算集群。或者,您可以使用MathWorks云中心创建和访问计算集群。有关更多信息,请参见开始使用云计算中心。对于这个示例,确保您的集群在MATLAB是设置为默认选项卡,在平行>选择一个默认的集群。之后,上传数据到一个Amazon S3 bucket和直接从MATLAB使用它。这个示例使用的副本CIFAR-10已经存储在Amazon S3数据集。说明,请参阅在AWS与深度学习数据工作

加载数据集从云端

负荷训练和测试数据集从云端imageDatastore。将训练数据集分为训练集和验证集,并保持测试数据集来测试的最佳网络参数扫描。在本例中,您使用的一个副本CIFAR-10存储在Amazon S3数据集。确保人员访问数据存储在云端,确保AWS凭证正确设置环境变量。看到在AWS与深度学习数据工作

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

培养和增强图像数据通过建立一个网络augmentedImageDatastore对象。使用随机翻译和水平的反映。数据增加有助于防止网络过度拟合和记忆的训练图像的细节。

图象尺寸= [32 32 3];pixelRange = 4 [4];imageAugmenter = imageDataAugmenter (“RandXReflection”,真的,“RandXTranslation”pixelRange,“RandYTranslation”,pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,“DataAugmentation”imageAugmenter,“OutputSizeMode”,“randcrop”);

同时训练多个网络

定义培训选项。设置mini-batch大小和规模根据mini-batch最初的学习速率线性尺寸。设置验证频率,这样trainNetwork验证每个时代网络一次。

miniBatchSize = 128;initialLearnRate = 1 e 1 * miniBatchSize / 256;validationFrequency =地板(元素个数(imdsTrain.Labels) / miniBatchSize);选择= trainingOptions (“个”,“MiniBatchSize”miniBatchSize,%设置mini-batch大小“详细”假的,%不发送命令行输出。“InitialLearnRate”initialLearnRate,%设置学习速率。“L2Regularization”1平台以及“MaxEpochs”30岁的“洗牌”,“every-epoch”,“ValidationData”imdsValidation,“ValidationFrequency”,validationFrequency);

指定的网络体系结构的深度参数扫描。执行一个平行的参数扫描训练几个网络同时使用parfeval。用一个循环遍历扫描不同的网络架构。创建一个helper函数createNetworkArchitecture的脚本,它接受一个输入参数控制网络的深度和为CIFAR-10创建架构。使用parfeval将执行的计算trainNetwork一个工人在集群。parfeval返回一个未来变量来保存训练网络时和培训信息计算完成。

netDepths = 1:4;idx = 1:元素个数(netDepths) networksFuture (idx) = parfeval (@trainNetwork 2augmentedImdsTrain createNetworkArchitecture (netDepths (idx)),选择);结束
开始平行池(parpool)使用“MyCluster”概要文件…连接到平行池(工人数量:4)。

parfeval不阻止MATLAB,这意味着你可以继续执行命令。在这种情况下,获得训练网络,通过使用他们的培训信息fetchOutputsnetworksFuture。的fetchOutputs等到未来变量函数完成。

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

获得的最终验证精度通过访问网络trainingInfo结构。

精度= [trainingInfo.FinalValidationAccuracy]
精度=1×472.5600 77.2600 79.4000 78.6800

选择最好的网络方面的准确性。测试其性能对测试数据集。

[~,我]= max(精度);bestNetwork = trainedNetworks(我(1));YPredicted =分类(bestNetwork imdsTest);精度= (YPredicted = = imdsTest.Labels) /元素个数之和(imdsTest.Labels)
精度= 0.7840

计算测试数据的混淆矩阵。

图(“单位”,“归一化”,“位置”(0.2 - 0.2 0.4 - 0.4));confusionchart (imdsTest.Labels YPredicted,“RowSummary”,“row-normalized”,“ColumnSummary”,“column-normalized”);

培训期间发送反馈数据

准备和初始化块显示在每个工人的培训进展。使用animatedLine一个方便的方式显示变化的数据。

f =图;f。可见= true;i = 1:4次要情节(2,2,我)包含(“迭代”);ylabel (“训练的准确性”);行(i) = animatedline;结束

员工的培训进度数据发送到客户端使用DataQueue,然后画出数据。每次更新情节的工人通过发送训练进度反馈afterEach。的参数选择包含职工信息,训练迭代,训练精度。

D = parallel.pool.DataQueue;afterEach (D, @(选择)updatePlot(线路、选择{:}));

指定的网络体系结构的深度扫描参数,并执行并行参数扫描使用parfeval。允许员工访问任何辅助函数在这个脚本中,通过将脚本添加到当前池作为附加文件。定义一个输出函数的培训选择发送培训进展从工人到客户机。培训选项取决于工人的索引,必须包含内部循环。

netDepths = 1:4;addAttachedFiles (gcp mfilename);idx = 1:元素个数(netDepths) miniBatchSize = 128;initialLearnRate = 1 e 1 * miniBatchSize / 256;%根据mini-batch学习速率的大小。validationFrequency =地板(元素个数(imdsTrain.Labels) / miniBatchSize);选择= trainingOptions (“个”,“OutputFcn”@(州)sendTrainingProgress (D idx状态),%设置输出函数将中间结果发送到客户端。“MiniBatchSize”miniBatchSize,%设置相应MiniBatchSize扫描。“详细”假的,%不发送命令行输出。“InitialLearnRate”initialLearnRate,%设置学习速率。“L2Regularization”1平台以及“MaxEpochs”30岁的“洗牌”,“every-epoch”,“ValidationData”imdsValidation,“ValidationFrequency”,validationFrequency);networksFuture (idx) = parfeval (@trainNetwork 2augmentedImdsTrain createNetworkArchitecture (netDepths (idx)),选择);结束

parfeval调用trainNetwork在集群中的一个工人。计算发生在后台,所以你可以在MATLAB继续工作。如果你想要停止parfeval计算,你可以叫取消未来在其相应的变量。例如,如果您注意到,网络是表现不佳,你可以取消它的未来。当你这样做的时候,下一个排队未来变量开始计算。

在这种情况下,获取训练网络,通过调用他们的培训信息fetchOutputs对未来的变量。

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

为每个网络获得最终的验证精度。

精度= [trainingInfo.FinalValidationAccuracy]
精度=1×472.9200 77.4800 76.9200 77.0400

辅助函数

为CIFAR-10数据集定义一个网络体系结构与功能,并使用一个输入参数来调整网络的深度。简化代码,使用卷积块卷积输入。池层downsample空间维度。

函数层= createNetworkArchitecture (netDepth)图象尺寸= [32 32 3];netWidth =轮(16 /√(netDepth));% netWidth控制过滤器在一个回旋的块的数量层= [imageInputLayer(图象尺寸)convolutionalBlock netWidth, netDepth maxPooling2dLayer (2“步”2)convolutionalBlock (2 * netWidth netDepth) maxPooling2dLayer (2“步”2)convolutionalBlock (4 * netWidth netDepth) averagePooling2dLayer (8) fullyConnectedLayer (10) softmaxLayer classificationLayer];结束

定义一个函数创建一个卷积块网络体系结构。

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

定义一个函数来发送到客户机通过培训进展DataQueue

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

定义一个函数来更新更新块当一个工人发送一个中间结果。

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

另请参阅

(并行计算工具箱)||||

相关的话题