主要内容

使用parfeval培训多个深入学习网络

这个例子展示了如何使用parfeval对深度学习网络的网络结构进行深度参数扫描,并在训练过程中检索数据。

深度学习训练通常需要数小时或数天的时间,搜索好的架构可能很困难。使用并行计算,您可以加快并自动搜索好的模型。如果可以访问具有多个图形处理单元(gpu)的机器,则可以使用本地并行池在数据集的本地副本上完成本示例。如果您想使用更多资源,可以将深度学习培训扩展到云。这个例子展示了如何使用parfeval在云中的集群中对网络架构的深度执行参数扫描。使用parfeval允许您在后台训练而不阻塞MATLAB,并提供选项,如果结果是令人满意的早期停止。您可以修改脚本,对任何其他参数进行参数扫描。此外,本示例还演示了如何在计算过程中通过使用DataQueue

要求

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

从云加载数据集

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

imd = imageDatastore (s3: / / cifar10cloud / cifar10 /火车'...'insertumbfolders',真的,...'labelsource'“foldernames”);imdstest = imageageataStore('s3:// cifar10cloud / cifar10 / test'...'insertumbfolders',真的,...'labelsource'“foldernames”);[IMDStrain,IMDSValidation] = SpliteachLabel(IMDS,0.9);

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

imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (...'randxreflection',真的,...“RandXTranslation”pixelRange,...“RandYTranslation”,pixelrange);Augmentedimdstrain = AugmentedimageGedataStore(图像化,IMDstrain,...“DataAugmentation”imageAugmenter,...“OutputSizeMode”“randcrop”);

同时训练多个网络

定义培训选项。设置小批量大小,并根据小批量大小线性缩放初始学习率。设置验证频率以便trainNetwork每个时代验证网络一次。

minibatchsize = 128;InitialLearnrate = 1E-1 * MINIBATCHSIZE / 256;validationFrequency =地板(元素个数(imdsTrain.Labels) / miniBatchSize);选择= trainingOptions (“个”...“MiniBatchSize”miniBatchSize,...%设置小批量大小“详细”,错误的,...%不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置比例学习率。“L2Regularization”1平台以及...“MaxEpochs”,30,...“洗牌”'每个时代'...'vightationdata'imdsValidation,...'验证职业', validationFrequency);

指定要执行参数扫描的网络架构的深度。使用并行参数扫描培训多个网络同时使用parfeval.使用循环迭代扫描中的不同网络架构。创建辅助功能createNetworkArchitecture,它接受一个输入参数来控制网络的深度,并为CIFAR-10创建一个架构。使用parfeval卸载由…所执行的计算trainNetwork给集群中的一个工作者。parfeval返回未来变量以在完成计算时持有培训的网络和培训信息。

netDepths = 1:4;idx = 1:numel(netdepth) networksFuture(idx) = parfeval(@trainNetwork,2,)...AugmentedImdstrain,CreateNetWorkArchitecture(NetDepths(IDX)),选项);结束
使用MyCluster配置文件启动并行池(parpool)…连接到并行池(工作人员数量:4)。

parfeval不会阻塞MATLAB,这意味着您可以继续执行命令。在这种情况下,通过使用获取训练过的网络及其训练信息fetchOutputsnetworksFuture.这fetchOutputs函数等待,直到将来的变量完成。

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

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

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

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

[~, I] = max(精度);bestNetwork = trainedNetworks(我(1));YPredicted =分类(bestNetwork imdsTest);精度= sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
精度= 0.7840

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

图('单位'“归一化”'位置',[0.2 0.2 0.4 0.4]);confusionchart (imdsTest。标签,YPredicted,“RowSummary”'行标准化'“ColumnSummary”“column-normalized”);

在培训期间发送反馈数据

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

f =图;f.Visible = true;i = 1:4子图(2,2,i)xlabel(“迭代”);ylabel (“训练的准确性”);行(i) = animatedline;结束

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

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

指定要执行参数扫描的网络架构的深度,并执行并行参数扫描使用parfeval.通过将脚本作为附加文件添加到当前池中,允许工作者访问该脚本中的任何helper函数。在培训选项中定义一个输出函数,将培训进度从工人发送到客户端。培训选择取决于工人的指标,必须包含在循环。

netDepths = 1:4;addAttachedFiles (gcp mfilename);IDX = 1:numel(netdepths)minibatchsize = 128;InitialLearnrate = 1E-1 * MINIBATCHSIZE / 256;%根据迷你批量大小缩放学习率。validationFrequency =地板(元素个数(imdsTrain.Labels) / miniBatchSize);选择= trainingOptions (“个”...“OutputFcn”@(州)sendTrainingProgress (D idx状态),...%设置输出函数,将中间结果发送到客户端。“MiniBatchSize”miniBatchSize,...%在扫描中设置相应的MiniBatchSize。“详细”,错误的,...%不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置比例学习率。“L2Regularization”1平台以及...“MaxEpochs”,30,...“洗牌”'每个时代'...'vightationdata'imdsValidation,...'验证职业', validationFrequency);networksFuture (idx) = parfeval (@trainNetwork 2...AugmentedImdstrain,CreateNetWorkArchitecture(NetDepths(IDX)),选项);结束

parfeval调用trainNetwork在集群中的一个worker上。计算是在后台进行的,所以您可以继续使用MATLAB。如果你想阻止parfeval计算,你可以调用取消对应的未来变量。例如,如果您观察到一个网络性能不佳,您可以取消它的未来。当您这样做时,下一个排队的未来变量将开始计算。

在这种情况下,通过调用获取训练过的网络及其训练信息fetchOutputs关于未来变量。

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

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

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

辅助函数

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

功能图层= createNetworkArchitecture(NetDepth)图像中= [32 32 3];netwidth = round(16 / sqrt(netdepth));% netWidth控制卷积块中过滤器的数量[imageInputLayer(imageSize)卷积块(netWidth,netDepth) maxPooling2dLayer(2,“步”2) convolutionalBlock (2 * netWidth netDepth) maxPooling2dLayer (2“步”,2) convolutionalBlock(4*netWidth,netDepth) averageepooling2dlayer (8) fulllyconnectedlayer (10) softmaxLayer classificationLayer;结束

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

功能layers =[卷积2dlayer (3,numFilters, numConvLayers)] layer =[卷积2dlayer (3,numFilters,“填充”'相同的')BatchnormalizationLayer Ruilulayer];图层= Repmat(图层,NumConvlayers,1);结束

定义一个函数将培训进度发送给客户DataQueue

功能sendtrainingprogress(d,Idx,Info)如果信息。状态= =“迭代”发送(D, {idx、info.Iteration info.TrainingAccuracy});结束结束

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

功能updatePlot(线、idx iter acc) addpoints(直线(idx)、iter acc);drawnowlimitratenocallbacks.结束

另请参阅

|||(深度学习工具箱)|(深度学习工具箱)

相关话题