主要内容

并行训练深度学习网络

这个例子展示了如何在本地机器上运行多个深度学习实验。使用此示例作为模板,您可以修改网络层和培训选项,以满足特定的应用程序需求。您可以对单个或多个gpu使用这种方法。如果你只有一个GPU,网络就会在后台一个接一个地训练。本例中的方法使您能够在进行深度学习实验时继续使用MATLAB®。

作为替代,您可以使用实验管理器交互式并行训练多个深度网络。有关更多信息,请参见使用实验管理器并行训练网络

准备数据集

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

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

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

  • 将数据集上传到Amazon S3桶中。例如,请参见上传深度学习数据到云(并行计算工具箱)

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

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

加载数据集

使用。加载数据集imageDatastore对象。将数据集分解为训练集、验证集和测试集。

imd = imageDatastore (datasetLocation,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain, imdsValidation imdsTest] = splitEachLabel (imd, 0.8, 0.1);

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

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

并行列车网络

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

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

要在培训期间从工人那里发送培训进度信息,请使用parallel.pool.DataQueue(并行计算工具箱)对象。要了解关于如何在训练期间使用数据队列获取反馈的更多信息,请参见示例使用parfeval训练多个深度学习网络(并行计算工具箱)

dataqueue = parallel.pool.DataQueue;

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

[layersCell,选项]= networkLayersAndOptions (augmentedImdsTrain、imdsValidation dataqueue);

准备训练进度图,并设置一个回调函数,以便在每个worker向队列发送数据后更新这些图。preparePlotsupdatePlots是本示例万博1manbetx的支持函数。

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

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

若要在并行工作器中保存计算结果,请使用future对象。为每次训练的结果预先分配一个未来对象数组。

trainingFuture(1:元素个数(layersCell)) = parallel.FevalFuture;

循环通过网络层和选项使用循环,并使用parfeval(并行计算工具箱)用一个并行的工人来训练网络。请求两个输出参数trainNetwork,指定2作为的第二个输入参数parfeval

i=1:numel(layersCell) trainingFuture(i) = parfeval(@trainNetwork,2,augmentedImdsTrain,layersCell{i},options(i));结束

parfeval不会阻塞MATLAB,所以你可以继续工作,而计算发生。

要从未来对象中获取结果,请使用fetchOutputs函数。对于本例,获取训练过的网络及其训练信息。fetchOutputs块MATLAB,直到结果可用。这一步可能需要几分钟。

(网络,trainingInfo) = fetchOutputs (trainingFuture);

将结果保存到磁盘保存函数。要稍后再次加载结果,请使用负载函数。使用sprintfdatetime使用当前日期和时间来命名文件。

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

阴谋的结果

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

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

图(“单位”“归一化”“位置”,[0.1 0.1 0.6 0.6]);标题(“训练发展情节”);i = 1:元素个数(layersCell)次要情节(2,元素个数(layersCell), i);持有;网格;ylim (100 [0]);iterationsPerEpoch =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingAccuracy);情节(时代,trainingInfo(我)。ValidationAccuracy,“同意”“MarkerSize”10);结束次要情节(元素个数(layersCell), 1), ylabel (“准确性”);

然后,使用子图的第二行绘制训练损失与历元数以及验证损失的关系图。

i=1:numel(layersCell) subplot(2,numel(layersCell),numel(layersCell) + i);持有;网格;ylim (max ([trainingInfo.TrainingLoss]) [0]);iterationsPerEpoch =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingLoss);情节(时代,trainingInfo(我)。ValidationLoss,“同意”“MarkerSize”10);包含(“时代”);结束次要情节(元素个数(layersCell),元素个数(layersCell) + 1), ylabel (“损失”);

选好网络后,就可以使用了分类并获得其对试验数据的准确性imdsTest

另请参阅

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

相关的例子

更多关于