主要内容

使用帕菲尔培养多种深度学习网络

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

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

要求

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

从云加载数据集

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

imds=图像数据存储(“s3://cifar10cloud/cifar10/train”,...“包含子文件夹”符合事实的...“标签源”,“foldernames”); imdsTest=图像数据存储(“s3://cifar10cloud/cifar10/test”,...“包含子文件夹”符合事实的...“标签源”,“foldernames”); [imdsTrain,imdsValidation]=拆分每个标签(imds,0.9);

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

imageSize=[32 32 3];pixelRange=[-4];imageAugmenter=imageDataAugmenter(...“随机选择”符合事实的...“RandXTranslation”,像素范围,...“RandYTranslation”,像素范围);augmentedImdsTrain=augmentedImageDatastore(图像大小、imdsTrain、,...“数据增强”imageAugmenter,...“OutputSizeMode”,“randcrop”);

同时训练多个网络

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

miniBatchSize=128;initialLearnRate=1e-1*miniBatchSize/256;validationFrequency=楼层(numel(imdsTrain.Labels)/miniBatchSize);选项=培训选项(“个”,...“MiniBatchSize”miniBatchSize,...%设置最小批量大小“详细”错误的...%不要发送命令行输出。“InitialLearnRate”,initialLearnRate,...%设置比例学习率。“L2规范化”1平台以及...“MaxEpochs”,30,...“洗牌”,“每个时代”,...“验证数据”,imdsValidation,...“验证频率”, validationFrequency);

指定要在其上进行参数扫描的网络架构的深度。使用并行参数扫描训练多个网络帕菲尔。使用循环在扫描中迭代不同的网络体系结构。创建帮助器函数createNetworkArchitecture,它接受一个输入参数来控制网络的深度,并为CIFAR-10创建一个架构。使用帕菲尔卸载由…所执行的计算trainNetwork给集群中的一个工作者。帕菲尔返回一个未来变量,以在计算完成时保存经过训练的网络和训练信息。

netDepths = 1:4;对于idx = 1:numel(netdepth) networksFuture(idx) = parfeval(@trainNetwork,2,)...augmentedImdsTrain、createNetworkArchitecture(NetDepth(idx))、选项;结束
正在使用“MyCluster”配置文件启动并行池(parpool)。。。已连接到并行池(工作线程数:4)。

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

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

通过访问培训信息结构

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

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

[~,I]=最大(精度);最佳网络=训练网络(I(1));YPredicted=分类(最佳网络,imdsTest);精度=总和(YPredicted==imdsTest.Labels)/numel(imdsTest.Labels)
精度= 0.7840

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

图(“单位”,“正常化”,“位置”,[0.2 0.2 0.4 0.4]);confusionchart (imdsTest。标签,YPredicted,“RowSummary”,“行规范化”,“ColumnSummary”,“列规格化”);

在培训期间发送反馈数据

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

f =图;f.Visible = true;对于i=1:4子图(2,2,i)xlabel(“迭代”);伊莱贝尔(“训练准确性”);线(i)=动画线;结束

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

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

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

netDepths = 1:4;addAttachedFiles (gcp mfilename);对于idx=1:numel(NetDepth)miniBatchSize=128;initialLearnRate=1e-1*miniBatchSize/256;%根据最小批量大小调整学习速率。validationFrequency=楼层(numel(imdsTrain.Labels)/miniBatchSize);选项=培训选项(“个”,...“OutputFcn”,@(州)发送培训进度(D、idx、州),...%设置输出函数,将中间结果发送到客户端。“MiniBatchSize”miniBatchSize,...%在扫描中设置相应的MiniBatchSize。“详细”错误的...%不要发送命令行输出。“InitialLearnRate”,initialLearnRate,...%设置比例学习率。“L2规范化”1平台以及...“MaxEpochs”,30,...“洗牌”,“每个时代”,...“验证数据”,imdsValidation,...“验证频率”,验证频率);网络未来(idx)=参数(@trainNetwork,2,...augmentedImdsTrain、createNetworkArchitecture(NetDepth(idx))、选项;结束

帕菲尔援引trainNetwork在集群中的一个worker上。计算是在后台进行的,所以您可以继续使用MATLAB。如果你想阻止帕菲尔计算,你可以调用取消在其相应的未来变量上。例如,如果观察到网络性能不佳,可以取消其未来。执行此操作时,下一个排队的未来变量将开始计算。

在这种情况下,通过调用fetchOutputs关于未来变量。

[trainedNetworks, trainingInfo] = fetchOutputs (networksFuture);

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

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

辅助函数

使用函数定义CIFAR-10数据集的网络体系结构,并使用输入参数调整网络深度。为简化代码,请使用卷积输入的卷积块。池层对空间维度进行向下采样。

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

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

作用层=卷积块(numFilters,numConvLayers)层=[卷积2dlayer(3,numFilters,“填充”,“一样”)batchNormalizationLayer reluLayer];层=repmat(层,numConvLayers,1);结束

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

作用发送培训进度(D、idx、信息)如果信息。状态= =“迭代”发送(D, {idx、info.Iteration info.TrainingAccuracy});结束结束

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

作用updatePlot(lines,idx,iter,acc)添加点(lines(idx),iter,acc);drawnowlimitrate夜猫子结束

另见

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

相关话题