这个例子展示了如何在本地机器上运行多个深度学习实验。使用此示例作为模板,您可以修改网络层和培训选项,以满足您特定的应用需求。您可以将此方法用于单个或多个gpu。如果你只有一个GPU,网络会在后台一个接一个地训练。本例中的方法使您能够在进行深度学习实验时继续使用MATLAB®。
作为替代,你可以使用实验管理器交互式地并行训练多个深度网络。有关更多信息,请参见使用实验管理器并行训练网络.
在运行示例之前,必须访问深度学习数据集的本地副本。这个例子使用了一个包含从0到9的数字合成图像的数据集。在下面的代码中,将位置更改为指向您的数据集。
datasetLocation = fullfile(matlabroot,“工具箱”,“nnet”,...“nndemos”,“nndatasets”,“DigitDataset”);
如果希望使用更多资源运行实验,可以在云中的集群中运行此示例。
上传数据集到Amazon S3桶。有关示例,请参见将深度学习数据上传到云端.
创建云集群。在MATLAB中,您可以直接从MATLAB Desktop在云中创建集群。有关更多信息,请参见创建云集群(并行计算工具箱).
选择您的云集群作为默认值首页选项卡,在环境部分中,选择平行>选择默认集群.
控件加载数据集imageDatastore
对象。将数据集分成训练集、验证集和测试集。
imds = imageDatastore(datasetLocation,...“IncludeSubfolders”,真的,...“LabelSource”,“foldernames”);[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.8,0.1);
要使用增强图像数据训练网络,请创建一个augmentedImageDatastore
.使用随机平移和水平反射。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。
imageSize = [28 28 1];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augmentedImdsTrain = augmentedimagedastore (imageSize,imdsTrain,...“DataAugmentation”, imageAugmenter);
启动一个并行池,其worker数量与gpu数量相同。可用图形处理器的个数可以通过gpuDeviceCount
(并行计算工具箱)函数。MATLAB为每个worker分配不同的GPU。默认情况下,parpool
使用默认集群配置文件。如果您没有更改默认值,则默认值为当地的
.这个例子是在一台有2个gpu的机器上运行的。
numgpu = gpuDeviceCount(“可用”);parpool (numGPUs);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:2)。
要在培训期间从工人发送培训进度信息,请使用parallel.pool.DataQueue
(并行计算工具箱)对象。要了解更多关于如何在训练期间使用数据队列获取反馈的信息,请参阅示例使用parfeval训练多个深度学习网络.
dataqueue = parallel.pool.DataQueue;
定义网络层和培训选项。为了代码的可读性,您可以在一个单独的函数中定义它们,该函数返回几个网络体系结构和训练选项。在这种情况下,networkLayersAndOptions
返回网络层的单元格数组和相同长度的训练选项数组。在MATLAB中打开这个例子,然后单击networkLayersAndOptions
打开配套功能金宝appnetworkLayersAndOptions
.粘贴您自己的网络层和选项。该文件包含示例训练选项,演示如何使用输出函数将信息发送到数据队列。
[layersCell,options] = networkLayersAndOptions(augmentedImdsTrain,imdsValidation,dataqueue);
准备训练进度图,并设置回调函数,在每个worker将数据发送到队列后更新这些图。preparePlots
而且updatePlots
是本例的金宝app支持函数。
handles = preparePlots(numel(layersCell));
afterEach (dataqueue @(数据)updatePlots(处理、数据));
要在并行工作中保存计算结果,请使用future对象。为每次训练的结果预分配一个未来对象数组。
trainingFuture(1:numel(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直到结果可用。这一步可能需要几分钟。
[network,trainingInfo] = fetchOutputs(trainingFuture);
方法将结果保存到磁盘保存
函数。要稍后再次加载结果,请使用负载
函数。使用sprintf
而且datetime
使用当前日期和时间命名文件。
文件名= sprintf(“实验——% s”datetime (“现在”,“格式”,的名称“T”HHmmss”));保存(文件名,“网络”,“trainingInfo”);
在网络完成训练后,利用网络中的信息,绘制网络的训练进度trainingInfo
.
使用子图来为每个网络分布不同的图。对于本例,使用第一行子图来绘制训练精度与历元数以及验证精度的关系。
图(“单位”,“归一化”,“位置”,[0.1 0.1 0.6 0.6]);标题(“训练进度图”);为i = 1:元素个数(layersCell)次要情节(2,元素个数(layersCell), i);持有在;网格在;ylim (100 [0]);iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);epoch = (1: number (trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingAccuracy);情节(时代,trainingInfo(我)。ValidationAccuracy,“同意”,“MarkerSize”10);结束次要情节(元素个数(layersCell), 1), ylabel (“准确性”);
然后,使用第二行子图绘制训练损失与历元数以及验证损失的关系。
为i=1:数字(layersCell) subplot(2,数字(layersCell),数字(layersCell) + i);持有在;网格在;ylim (max ([trainingInfo.TrainingLoss]) [0]);iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);epoch = (1: number (trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingLoss);情节(时代,trainingInfo(我)。ValidationLoss,“同意”,“MarkerSize”10);包含(“时代”);结束次要情节(元素个数(layersCell),元素个数(layersCell) + 1), ylabel (“损失”);
选择网络后,就可以使用了分类
并在试验数据上得到其准确性imdsTest
.
实验管理器|augmentedImageDatastore
|imageDatastore
|parfeval
(并行计算工具箱)|fetchOutputs
|trainNetwork
|trainingOptions