主要内容

并行列车深入学习网络

此示例显示如何在本地计算机上运行多个深度学习实验。使用此示例作为模板,您可以修改网络图层和培训选项以满足您的特定应用程序需求。您可以使用单个或多个GPU使用此方法。如果您有一个GPU,则网络在后台之后的网络训练。此示例中的方法使您可以继续使用MATLAB®而深入学习实验正在进行中。

作为替代方案,您可以使用实验经理以互动地捕获多个深网络并行。有关更多信息,请参阅使用实验经理并行培训网络

准备数据集

在您可以运行该示例之前,必须访问深度学习数据集的本地副本。此示例使用具有从0到9的数字的合成图像设置的数据集。在以下代码中,将位置更改为指向数据集。

dataseTlocation = fullfile(matlabroot,'工具箱''nnet'......'nndemos''nndatasets''digitdataset');

如果要使用更多资源运行实验,则可以在云中的群集中运行此示例。

  • 将数据上传到Amazon S3存储桶。例如,看到将深度学习数据上传到云端(并行计算工具箱)

  • 创建云群集。在MATLAB中,您可以直接从MATLAB桌面创建云中的群集。有关更多信息,请参阅创建云集群(并行计算工具箱)

  • 选择云群作为默认值标签,在环境部分,选择平行>选择默认群集

加载数据集

使用a使用一个加载数据集imageageAtastore.目的。将数据拆分为培训,验证和测试集。

imds = imageageataStore(DataSetLocation,......'insertumbfolders',真的,......'labelsource''foldernames');[IMDStrain,IMDSValidation,IMDSTEST] = SpliteachLabel(IMDS,0.8,0.1);

要使用增强图像数据训练网络,请创建一个AugmentedimageGedataStore.。使用随机翻译和水平反射。数据增强有助于防止网络过度接收和记忆培训图像的确切细节。

图像= [28 28 1];PIXELRANGE = [-4 4];imageaugmenter = imagedataAugmenter(......'randxreflection',真的,......'randxtranslation',pixelrange,......'randytranslation',pixelrange);Augmentedimdstrain = AugmentedimageGedataStore(图像化,IMDstrain,......'dataaugmentation',imageaugmender);

并行列车网络

开始一个平行的池,与GPU一样多的工人。您可以使用使用方法查看可用GPU的数量gpudeviceCount.(并行计算工具箱)功能。Matlab为每个工人分配不同的GPU。默认,parpool.使用默认的群集配置文件。如果您没有更改默认值,则是当地的。此示例使用具有2个GPU的机器运行。

numgpus = gpudevicecount(“可用的”);parpool(numgpus);
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数量:2)。

要在培训期间从工人发送培训进度信息,请使用aparallel.pool.dataqueue.(并行计算工具箱)目的。要了解有关如何在培训期间使用数据队列获得反馈的更多信息,请参阅示例使用Parfeval培训多个深入学习网络(并行计算工具箱)

datauqueue = parallel.pool.dataqueue;

定义网络层和培训选项。对于代码可读性,您可以在返回多个网络架构和培训选项的单独函数中定义它们。在这种情况下,NetworkLayersAndOptions.返回网络图层的单元格数组和相同长度的培训选项数组。在Matlab中打开此示例,然后单击NetworkLayersAndOptions.打开支持功能金宝appNetworkLayersAndOptions.。粘贴自己的网络层和选项。该文件包含示例培训选项,显示如何使用输出功能向数据队列发送信息。

[layerscell,选项] = networklayersandoptions(AugmentedImdstrain,IMDSValidation,DataQueue);

准备培训进度图,并在每个工人向队列发送数据后,设置回调函数以更新这些绘图。练习产更新平面图为此示例金宝app支持功能。

Handles =练习册(Numel(Layerscell));

SulteAled(DataQueue,@(数据)updateplots(句柄,数据));

要持有计算结果,并行工作人员,请使用未来的对象。为每次培训的结果预先释放一系列未来对象。

训练文件(1:Numel(Layerscell))=并行.FevalFuture;

通过使用a循环通过网络层和选项为了循环,并使用Parfeval.(并行计算工具箱)在并行工作者训练网络。请求两个输出参数Trainnetwork., 指定2作为第二个输入论点Parfeval.

为了i = 1:numel(layerscell)培训future(i)= parfeval(@ trainnetwork,2,augmentedimdstrain,layerscell {i},选项(i));结尾

Parfeval.不阻止MATLAB,因此您可以在计算发生时继续工作。

要获取未来对象的结果,请使用fetchOutputs.功能。对于此示例,获取培训的网络及其培训信息。fetchOutputs.阻止MATLAB,直到结果可用。这一步可能需要几分钟。

[网络,TrainingInfo] = fetchOutputs(培训财务);

使用磁盘将结果保存到磁盘保存功能。稍后再加载结果,请使用加载功能。用Sprintf.约会时间使用当前日期和时间命名文件。

filename = sprintf('实验 - %s',约会时间('现在''格式''yyyymmdd''t''hmmss'));保存(filename,'网络''trainingInfo');

绘图结果

网络完成培训后,通过使用信息策略他们的培训进度TrainingInfo.

使用子点分配每个网络的不同图。对于此示例,使用第一行汇位来绘制训练准确性,以及验证精度以及验证准确性。

数字('单位''标准化''位置',[0.1 0.1 0.6 0.6]);标题('培训进展情节');为了i = 1:numel(layerscell)子图(2,numel(layerscell),i);抓住;网格;ylim([0 100]);iterationsperepoch = bloce(augmentedimdstrain.numobservations /选项(i).minibatchsize);epoch =(1:numel(traininginfo(i).trainingaguracy)/ iterationsperepoch;绘图(纪念,培训税文件(i).TrainingAccuracy);情节(时代,TrainingInfo(i).ValidationAccuracy,'.k''Markersize',10);结尾子图(2,Numel(Layerscell),1),Ylabel('准确性');

然后,使用第二行的子图来绘制训练损失与epoch的数量以及验证损失。

为了i = 1:numel(talterscell)子图(2,numel(layerscell),numel(layerscell)+ i);抓住;网格;ylim([0 max(traininginfo.trainingloss]);iterationsperepoch = bloce(augmentedimdstrain.numobservations /选项(i).minibatchsize);epoch =(1:numel(traininginfo(i).trainingaguracy)/ iterationsperepoch;绘图(时代,TrainingInfo(i).Tringloss);情节(epoch,traininginfo(i).validationloss,'.k''Markersize',10);Xlabel('时代');结尾子图(2,numel(layerscell),numel(layerscell)+1),ylabel('失利');

选择网络后,可以使用分类并在测试数据上获得其准确性IMDSTEST.

也可以看看

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

相关例子

更多关于