主要内容

并行列车深入学习网络

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

作为替代方案,您可以使用实验管理器(深度学习工具箱)以互动地捕获多个深网络并行。有关更多信息,请参阅使用实验管理器并行训练网络(深度学习工具箱)

准备数据集

在运行示例之前,必须能够访问深度学习数据集的本地副本。这个例子使用了一个包含从0到9的合成图像的数据集。在以下代码中,将位置更改为指向您的数据集。

datasetLocation = fullfile (matlabroot,“工具箱”“nnet”......'nndemos''nndatasets'“DigitDataset”);

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

  • 将数据集上传到Amazon S3桶中。例如,请参见将深度学习数据上传到云端

  • 创建云集群在MATLAB中,您可以直接从MATLAB桌面在云中创建集群。有关更多信息,请参阅创建云集群

  • 选择您的云集群作为默认的选项卡,环境部分,选择平行>选择默认群集

加载数据集

使用。加载数据集imageDatastore对象。将数据拆分为培训,验证和测试集。

imds = imageageataStore(DataSetLocation,......“IncludeSubfolders”,真实,......“LabelSource”'foldernames');[imdsTrain, imdsValidation imdsTest] = splitEachLabel (imd, 0.8, 0.1);

为了用增强的图像数据训练网络,创建一个AugmentedimageGedataStore.(深度学习工具箱).使用随机平移和水平反射。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

imageSize = [28 28 1];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter (......“RandXReflection”,真实,......“RandXTranslation”,pixelrange,......“RandYTranslation”, pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,......'dataaugmentation',imageaugmender);

并行列车网络

启动一个和gpu一样多的并行池。可用图形处理器数量可通过使用gpuDeviceCount函数。MATLAB为每个worker分配不同的GPU。默认情况下,parpool.使用默认的集群配置文件。如果您没有更改默认值,则会更改当地的.本示例使用一台带有2个gpu的机器运行。

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

要在培训期间从工人发送培训进度信息,请使用aparallel.pool.dataqueue.对象。要了解关于如何在训练期间使用数据队列获取反馈的更多信息,请参见示例使用parfeval训练多个深度学习网络

dataqueue = parallel.pool.DataQueue;

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

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

准备训练进度图,并设置一个回调函数,以便在每个worker向队列发送数据后更新这些图。练习产更新平面图是本示例金宝app的支持函数。

处理= preparePlots(元素个数(layersCell));

afterEach (dataqueue @(数据)updatePlots(处理、数据));

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

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

循环通过网络层和选项使用对于循环,并使用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.datetime使用当前日期和时间来命名文件。

filename = sprintf(“实验——% s”datetime ('现在''格式'的名称“T”HHmmss”));保存(filename,'网络''trainingInfo');

绘图结果

在网络完成训练后,利用内的信息绘制出网络训练进度TrainingInfo.

使用子图为每个网络分配不同的图。对于本例,使用子图的第一行根据epoch数绘制训练精度和验证精度。

图(“单位”'标准化'“位置”,[0.1 0.1 0.6 0.6]);标题('培训进展情节');对于i = 1:numel(layerscell)子图(2,numel(layerscell),i);hold;网格;ylim([0 100]);iterationsPerEpoch =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / 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);hold;网格;ylim (max ([trainingInfo.TrainingLoss]) [0]);iterationsPerEpoch =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingLoss);情节(时代,trainingInfo(我)。ValidationLoss,'.k'“MarkerSize”10);包含('epoch');结束子图(2,numel(layerscell),numel(layerscell)+1),ylabel(“损失”);

选择网络后,可以使用分类(深度学习工具箱)并在测试数据上获得其准确性imdsTest

另请参阅

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

相关例子

更多关于