这个例子展示了如何使用一个parfor
循环执行参数扫描训练选项。
深度学习训练通常需要数小时或数天,寻找良好的培训方案是很困难的。使用并行计算,可以加快和自动化你的寻找好的模型。如果你有访问一台机器与多个图形处理单元(gpu),你可以在一个本地副本完成这个示例数据集的本地parpool。如果你想使用更多的资源,你可以扩大到云深学习培训。这个例子展示了如何使用一个parfor循环对培训执行参数扫描选项MiniBatchSize
在集群的云。你可以修改脚本参数扫描其他培训选项。同时,这个例子展示了如何获得来自员工的反馈在计算使用DataQueue
。你也可以发送脚本作为集群的批处理作业,所以你可以继续工作或关闭MATLAB和获取结果。有关更多信息,请参见深度学习批处理作业发送到集群。
在运行这个例子之前,您需要配置一个集群和上传数据到云上。在MATLAB中,您可以在云中创建集群直接从MATLAB桌面。在家选项卡,平行菜单中,选择创建和管理集群。在集群配置文件管理器,单击创建云计算集群。或者,您可以使用MathWorks云中心创建和访问计算集群。有关更多信息,请参见开始使用云计算中心。对于这个示例,确保您的集群在MATLAB是设置为默认家选项卡,在平行>选择一个默认的集群。之后,上传数据到一个Amazon S3 bucket和直接从MATLAB使用它。这个示例使用的副本CIFAR-10已经存储在Amazon S3数据集。说明,请参阅深度学习的数据上传到云。
负荷训练和测试数据集从云端imageDatastore
。将训练数据集分为训练集和验证集,并保持测试数据集来测试的最佳网络参数扫描。在本例中使用的一个副本CIFAR-10存储在Amazon S3数据集。确保人员访问数据存储在云端,确保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”);
CIFAR-10数据集定义一个网络体系结构。为了简化代码,使用卷积卷积模块输入。池层downsample空间维度。
图象尺寸= [32 32 3];netDepth = 2;% netDepth控制一个回旋的块的深度netWidth = 16;% 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];
指定的mini-batch尺寸参数扫描。分配变量产生的网络和准确性。
miniBatchSizes = (64 128 256 512);numMiniBatchSizes =元素个数(miniBatchSizes);trainedNetworks =细胞(numMiniBatchSizes, 1);精度= 0 (numMiniBatchSizes, 1);
执行一个平行的参数扫描训练几个网络内部parfor
循环和不同mini-batch大小。集群中的工人培训网络同时发送培训网络和精度训练完成后。如果你想检查培训工作,集详细的
来真正的
在培训的选择。注意工人独立计算,所以命令行输出不是在相同的顺序顺序迭代。
parforidx = 1: numMiniBatchSizes miniBatchSize = miniBatchSizes (idx);initialLearnRate = 1 e 1 * miniBatchSize / 256;%根据mini-batch学习速率的大小。%定义培训选项。设置mini-batch大小。选择= trainingOptions (“个”,…“MiniBatchSize”miniBatchSize,…%设置相应MiniBatchSize扫描。“详细”假的,…%不发送命令行输出。“InitialLearnRate”initialLearnRate,…%设置学习速率。“L2Regularization”1平台以及…“MaxEpochs”30岁的…“洗牌”,“every-epoch”,…“ValidationData”imdsValidation,…“LearnRateSchedule”,“分段”,…“LearnRateDropFactor”,0.1,…“LearnRateDropPeriod”25);%在集群中的一个工人培训网络。网= trainNetwork (augmentedImdsTrain层,选项);%获得这个网络的准确性,使用训练网络%分类验证图像工人,比较预测标签%实际标签。YPredicted =分类(净,imdsValidation);精度(idx) = (YPredicted = = imdsValidation.Labels) /元素个数之和(imdsValidation.Labels);%将训练网络发送回客户端。trainedNetworks {idx} =净;结束
开始平行池(parpool)使用“MyClusterInTheCloud”概要文件…连接到平行池(工人数量:4)。
后parfor
完成后,trainedNetworks
包含生成的网络训练的工人。显示训练网络及其精度。
trainedNetworks
trainedNetworks =4×1单元阵列{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8188 0.8232 0.8162 0.8050
选择最好的网络方面的准确性。测试其性能对测试数据集。
[~,我]= max(精度);bestNetwork = trainedNetworks{我(1)};YPredicted =分类(bestNetwork imdsTest);精度= (YPredicted = = imdsTest.Labels) /元素个数之和(imdsTest.Labels)
精度= 0.8173
准备和初始化块显示在每个工人的培训进展。使用animatedLine
一个方便的方式显示变化的数据。
f =图;f。可见= true;为i = 1:4次要情节(2,2,我)包含(“迭代”);ylabel (“训练的准确性”);行(i) = animatedline;结束
员工的培训进度数据发送到客户端使用DataQueue
,然后画出数据。每次更新情节的工人通过发送训练进度反馈afterEach
。的参数选择
包含职工信息,训练迭代,训练精度。
D = parallel.pool.DataQueue;afterEach (D, @(选择)updatePlot(线路、选择{:}));
并行执行参数扫描训练几个网络内部parfor循环mini-batch大小不同。注意使用OutputFcn
在培训选项发送培训进展客户端每次迭代。这个图展示了四个不同的工人的培训进度在执行下面的代码。
parforidx = 1:元素个数(miniBatchSizes) miniBatchSize = miniBatchSizes (idx);initialLearnRate = 1 e 1 * miniBatchSize / 256;%根据miniBatchSize学习速率。%定义培训选项。设置输出函数发送数据%每个迭代到客户端。选择= trainingOptions (“个”,…“MiniBatchSize”miniBatchSize,…%设置相应MiniBatchSize扫描。“详细”假的,…%不发送命令行输出。“InitialLearnRate”initialLearnRate,…%设置学习速率。“OutputFcn”@(州)sendTrainingProgress (D idx状态),…%设置输出函数将中间结果发送到客户端。“L2Regularization”1平台以及…“MaxEpochs”30岁的…“洗牌”,“every-epoch”,…“ValidationData”imdsValidation,…“LearnRateSchedule”,“分段”,…“LearnRateDropFactor”,0.1,…“LearnRateDropPeriod”25);%在集群中的一个工人培训网络。工人们把%培训期间培训进展信息到客户端。网= trainNetwork (augmentedImdsTrain层,选项);%获得这个网络的准确性,使用训练网络%分类验证图像工人,比较预测标签%实际标签。YPredicted =分类(净,imdsValidation);精度(idx) = (YPredicted = = imdsValidation.Labels) /元素个数之和(imdsValidation.Labels);%将训练网络发送回客户端。trainedNetworks {idx} =净;结束
工人们…做分析和传输文件。
后parfor
完成后,trainedNetworks
包含生成的网络训练的工人。显示训练网络及其精度。
trainedNetworks
trainedNetworks =4×1单元阵列{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8214 0.8172 0.8132 0.8084
选择最好的网络方面的准确性。测试其性能对测试数据集。
[~,我]= max(精度);bestNetwork = trainedNetworks{我(1)};YPredicted =分类(bestNetwork imdsTest);精度= (YPredicted = = imdsTest.Labels) /元素个数之和(imdsTest.Labels)
精度= 0.8187
定义一个函数创建一个卷积块网络体系结构。
函数层= 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结束
trainNetwork
|parallel.pool.DataQueue
(并行计算工具箱)|imageDatastore