火车并行深度学习网络
这个例子展示了如何在本地机器上运行多个深度学习实验。使用这个例子作为一个模板,您可以修改网络层和培训选项来满足您的特定应用程序的需求。您可以使用这种方法与一个或多个gpu。如果你有一个单一的GPU,网络训练一个接一个的背景。在这个例子的方法使您能够继续使用MATLAB®深度学习实验是在进步。
作为一种替代方法,您可以使用实验管理器并行交互训练多个深度网络。有关更多信息,请参见并行使用实验管理器来训练网络。
准备数据集
您可以运行示例之前,您必须访问一个本地副本深度学习的数据集。这个例子使用一个数据集数字从0到9的合成图像。在以下代码中,位置更改为指向您的数据集。
datasetLocation = fullfile (matlabroot,“工具箱”,“nnet”,…“nndemos”,“nndatasets”,“DigitDataset”);
如果你想运行试验更多的资源,你可以在一个集群中运行这个例子在云端。
上传的数据设置为一个Amazon S3 bucket。例如,看到的在AWS与深度学习数据工作。
创建一个云计算集群。在MATLAB中,您可以在云中创建集群直接从MATLAB桌面。有关更多信息,请参见创建云计算集群(并行计算工具箱)。
选择您的云计算集群作为默认的家选项卡,环境部分中,选择平行>选择一个默认的集群。
加载数据集
通过使用一个加载数据集imageDatastore
对象。将数据集分为训练、验证和测试集。
imd = imageDatastore (datasetLocation,…“IncludeSubfolders”,真的,…“LabelSource”,“foldernames”);[imdsTrain, imdsValidation imdsTest] = splitEachLabel (imd, 0.8, 0.1);
与增强图像数据训练网络,创建一个augmentedImageDatastore
。使用随机翻译和水平的反映。数据增加有助于防止网络过度拟合和记忆的训练图像的细节。
图象尺寸= [28 28 1];pixelRange = 4 [4];imageAugmenter = imageDataAugmenter (…“RandXReflection”,真的,…“RandXTranslation”pixelRange,…“RandYTranslation”,pixelRange);imdsTrain augmentedImdsTrain = augmentedImageDatastore(图象尺寸,…“DataAugmentation”,imageAugmenter);
列车网络并行
开始一个尽可能多的工人gpu并行池。您可以检查gpu通过使用可用的数量gpuDeviceCount
(并行计算工具箱)函数。MATLAB分配一个不同的GPU每个工人。默认情况下,parpool
使用默认集群配置文件。如果你没有改变默认的,它是当地的
。这个例子是用一台机器2 gpu。
numGPUs = gpuDeviceCount (“可用”);parpool (numGPUs);
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:2)。
发送从员工培训期间,培训进展信息使用parallel.pool.DataQueue
(并行计算工具箱)对象。了解更多关于如何使用数据队列获取反馈训练期间,看到的例子使用parfeval训练多个深度学习网络。
dataqueue = parallel.pool.DataQueue;
定义网络层和培训选项。对于代码的可读性,可以定义在一个单独的函数,它返回几个网络体系结构和培训选项。在这种情况下,networkLayersAndOptions
返回一个数组单元阵列的网络层和训练长度相同的选项。在MATLAB然后点击打开这个例子networkLayersAndOptions
打开支持功能万博1manbetxnetworkLayersAndOptions
。粘贴在您自己的网络层和选项。文件包含样本训练选项,显示如何使用一个队列发送信息到数据输出功能。
[layersCell,选项]= networkLayersAndOptions (augmentedImdsTrain、imdsValidation dataqueue);
准备培训情节进展,并设置一个回调函数来更新这些情节后每个工人将数据发送到队列中。preparePlots
和updatePlots
对于这个万博1manbetx示例支持功能。
处理= preparePlots(元素个数(layersCell));
afterEach (dataqueue @(数据)updatePlots(处理、数据));
并行计算结果工人,使用未来的对象。Preallocate未来对象的数组,每个培训的结果。
trainingFuture(1:元素个数(layersCell)) = parallel.FevalFuture;
循环使用的网络层和选项为
循环,并使用parfeval
(并行计算工具箱)训练网络的并行工作。要求两个输出参数trainNetwork
,指定2
第二个输入参数parfeval
。
为i = 1:元素个数(layersCell) trainingFuture (i) = parfeval (@trainNetwork 2 augmentedImdsTrain, layersCell{},选项(i));结束
parfeval
不阻止MATLAB,所以你可以继续工作,而计算。
获取未来的结果对象,使用fetchOutputs
函数。对于这个示例,获取培训网络和他们的培训信息。fetchOutputs
块MATLAB直到结果是可用的。这一步可以花几分钟。
(网络,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 =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingAccuracy);情节(时代,trainingInfo .ValidationAccuracy(我),“同意”,“MarkerSize”10);结束次要情节(元素个数(layersCell), 1), ylabel (“准确性”);
然后,使用次要情节的第二行绘制培训损失对时代以及验证损失的数量。
为i = 1:元素个数(layersCell)次要情节(2,元素个数(layersCell),元素个数(layersCell) + i);持有在;网格在;ylim ([0 10]);iterationsPerEpoch =地板(augmentedImdsTrain.NumObservations /选项(i) .MiniBatchSize);时代=(1:元素个数(trainingInfo(我).TrainingAccuracy)) / iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingLoss);情节(时代,trainingInfo .ValidationLoss(我),“同意”,“MarkerSize”10);包含(“时代”);结束次要情节(元素个数(layersCell),元素个数(layersCell) + 1), ylabel (“损失”);
你选择一个网络之后,您可以使用分类
并获得其准确性的测试数据imdsTest
。
另请参阅
实验管理器|augmentedImageDatastore
|imageDatastore
|parfeval
(并行计算工具箱)|fetchOutputs
|trainNetwork
|trainingOptions