主要内容

使用帕菲尔训练多个深度学习网络

此示例演示如何使用帕菲尔在深度学习网络的网络架构深度上执行参数扫描,并在培训期间检索数据。

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

需求

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

从云中加载数据集

使用从云中加载训练和测试数据集imageDatastore。将培训数据集拆分为培训和验证集,并保留测试数据集以测试参数扫描中的最佳网络。在本例中,您使用存储在Amazon S3中的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);

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

imageSize=[32 32 3];pixelRange=[-4];imageAugmenter=imageDataAugmenter(...“RandXReflection”符合事实的...“随机翻译”,像素范围,...“兰迪翻译”, pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,...“数据增强”,影像增强器,...“OutputSizeMode”,“randcrop”);

同时训练多个网络

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

miniBatchSize = 128;initialLearnRate = 1e-1 * miniBatchSize/256;validationFrequency=楼层(numel(imdsTrain.Labels)/miniBatchSize);选项=培训选项(“sgdm”,...“MiniBatchSize”,小批量,...%设置最小批量大小“冗长”假的,...%不发送命令行输出。“初始学习率”,initialLearnRate,...%设置缩放学习速率。“L2规范化”,1e-10,...“MaxEpochs”30岁的...“洗牌”,“every-epoch”,...“ValidationData”,imdsValidation,...“ValidationFrequency”,验证频率);

指定要在其上进行参数扫描的网络架构的深度。使用并行参数扫描训练多个网络帕菲尔.在扫描中使用一个循环来迭代不同的网络架构。创建helper函数createNetworkArchitecture在脚本的末尾,它接受一个输入参数来控制网络的深度,并为CIFAR-10创建一个体系结构。使用帕菲尔卸载由执行的计算列车网络向群集中的工作进程发送。帕菲尔返回一个未来变量,用于保存计算完成时经过训练的网络和训练信息。

净深度=1:4;对于idx=1:numel(网络深度)网络未来(idx)=参数(@trainNetwork,2,...augmentedImdsTrain createNetworkArchitecture (netDepths (idx)),选择);终止
正在使用“MyCluster”配置文件启动并行池(parpool)。。。已连接到并行池(工作线程数:4)。

帕菲尔不阻塞MATLAB,这意味着您可以继续执行命令。在这种情况下,使用获取输出网络未来.的获取输出函数将等待将来的变量完成。

[trainedNetworks,trainingInfo]=获取输出(网络未来);

通过访问,获得网络的最终验证精度培训信息结构

准确度=[培训信息最终验证准确度]
准确度=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]); 混淆图(IMD测试标签,预测,“行摘要”,“row-normalized”,“专栏摘要”,“列规格化”);

在培训期间发送反馈数据

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

f=数字;f.可见=真实;对于i = 1:4次要情节(2,2,我)包含(“迭代”);伊莱贝尔(“训练准确性”);线(i)=动画线;终止

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

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

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

净深度=1:4;addAttachedFiles(gcp、mfilename);对于idx = 1:numel(netdepth) miniBatchSize = 128;initialLearnRate = 1e-1 * miniBatchSize/256;%根据小批量大小缩放学习率。validationFrequency=楼层(numel(imdsTrain.Labels)/miniBatchSize);选项=培训选项(“sgdm”,...“OutputFcn”,@(州)发送培训进度(D、idx、州),...%设置输出函数以向客户端发送中间结果。“MiniBatchSize”,小批量,...%在扫描中设置相应的MiniBatchSize。“冗长”假的,...%不发送命令行输出。“初始学习率”,initialLearnRate,...%设置缩放学习速率。“L2规范化”,1e-10,...“MaxEpochs”30岁的...“洗牌”,“every-epoch”,...“ValidationData”,imdsValidation,...“ValidationFrequency”,验证频率);网络未来(idx)=参数(@trainNetwork,2,...augmentedImdsTrain createNetworkArchitecture (netDepths (idx)),选择);终止

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

在这种情况下,通过调用获取输出关于未来变量。

[trainedNetworks,trainingInfo]=获取输出(网络未来);

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

准确度=[培训信息最终验证准确度]
准确度=1×472.9200 77.4800 76.9200 77.0400

辅助函数

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

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

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

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

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

函数sendTrainingProgress (D, idx信息)如果信息状态==“迭代”send(D,{idx,info.Iteration,info.TrainingAccuracy});终止终止

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

函数updatePlot(lines,idx,iter,acc)添加点(lines(idx),iter,acc);drawnow限制nocallbacks终止

另见

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

相关的话题