本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

使用自动并行支持功能在云中训练网络

此示例说明如何利用 MATLAB 对并行训练的自动支持来训练卷积神经网络。深度学习训练通常需要几小时或几天。借助并行计算,您可以在本地或云群集中使用多个图形处理单元 (GPU) 来加快训练速度。如果您可以使用具有多个 GPU 的计算机,则可以在数据的本地副本上完成此示例。如果要使用更多资源,则可以将深度学习训练扩展到云。要了解有关并行训练选项的详细信息,请参阅Scale Up Deep Learning in Parallel and in the Cloud。此示例逐步指导您如何利用 MATLAB 的自动并行支持功能在云群集中训练深度学习网络。

要求

您需要配置群集并将数据上传到云,才能运行该示例。在 MATLAB 中,您可以直接通过 MATLAB 桌面在云中创建群集。在主页选项卡上,在 Parallel 菜单中,选择 Create and Manage Clusters。在 Cluster Profile Manager 中,点击 Create Cloud Cluster。您也可以使用 MathWorks 云中心来创建和访问计算群集。有关详细信息,请参阅云中心快速入门。然后,将您的数据上传到 Amazon S3 存储桶并直接从 MATLAB 访问它。此示例使用已存储在 Amazon S3 中的 CIFAR-10 数据集的副本。有关说明,请参阅将深度学习数据上传到云

设置并行池

在群集中启动并行池,并将工作进程数设置为群集中的 GPU 数量。如果指定的工作进程数大于 GPU 数量,则其余的工作进程将处于空闲状态。此示例假设您所使用的群集设置为默认群集配置文件。在 MATLAB 主页选项卡上的 Parallel > Select a Default Cluster 中,检查默认群集配置文件。

numberOfWorkers = 8;
parpool(numberOfWorkers);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ...
connected to 8 workers.

从云中加载数据集

使用 imageDatastore 从云中加载训练数据集和测试数据集。在本示例中,您使用存储在 Amazon S3 中的 CIFAR-10 数据集的副本。为确保工作进程能够访问云中的数据存储,请确保已正确设置 AWS 凭据的环境变量。请参阅将深度学习数据上传到云

imdsTrain = imageDatastore('s3://cifar10cloud/cifar10/train', ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

imdsTest = imageDatastore('s3://cifar10cloud/cifar10/test', ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

通过创建 augmentedImageDatastore 对象,用增强的图像数据训练网络。使用随机平移和水平翻转。数据增强有助于防止网络过拟合和记忆训练图像的具体细节。

imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    'DataAugmentation',imageAugmenter, ...
    'OutputSizeMode','randcrop');

定义网络架构和训练选项

为 CIFAR-10 数据集定义一个网络架构。为了简化代码,使用对输入进行卷积的卷积块。池化层对空间维度进行下采样。

blockDepth = 4; % blockDepth controls the depth of a convolutional block
netWidth = 32; % netWidth controls the number of filters in a convolutional block

layers = [
    imageInputLayer(imageSize) 
    
    convolutionalBlock(netWidth,blockDepth)
    maxPooling2dLayer(2,'Stride',2)
    convolutionalBlock(2*netWidth,blockDepth)
    maxPooling2dLayer(2,'Stride',2)    
    convolutionalBlock(4*netWidth,blockDepth)
    averagePooling2dLayer(8) 
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer
];

定义训练选项。通过将执行环境设置为 parallel,使用当前群集并行训练网络。当您使用多个 GPU 时,就增加了可用的计算资源。根据 GPU 的数量扩大小批量大小,以保持每个 GPU 上的工作负载不变。根据小批量大小缩放学习率。使用学习率调度,以随着训练的进行降低学习率。打开训练进度图可在训练过程中获得可视化的反馈数据。

miniBatchSize = 256 * numberOfWorkers;
initialLearnRate = 1e-1 * miniBatchSize/256;

options = trainingOptions('sgdm', ...
    'ExecutionEnvironment','parallel', ... % Turn on automatic parallel support.
    'InitialLearnRate',initialLearnRate, ... % Set the initial learning rate.
    'MiniBatchSize',miniBatchSize, ... % Set the MiniBatchSize.
    'Verbose',false, ... % Do not send command line output.
    'Plots','training-progress', ... % Turn on the training progress plot.
    'L2Regularization',1e-10, ...
    'MaxEpochs',50, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',45);

训练网络及其分类使用

在群集中训练网络。在训练过程中,绘图将会显示进度。

net = trainNetwork(augmentedImdsTrain,layers,options)

net = 
  SeriesNetwork with properties:

    Layers: [43×1 nnet.cnn.layer.Layer]

通过使用经过训练的网络对本地计算机上的测试图像进行分类,确定网络的准确度。然后将预测的标签与实际标签进行比较。

YPredicted = classify(net,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)

定义辅助函数

定义一个函数,以便在网络架构中创建卷积块。

function layers = convolutionalBlock(numFilters,numConvLayers)
    layers = [
        convolution2dLayer(3,numFilters,'Padding','same')
        batchNormalizationLayer
        reluLayer
    ];
    
    layers = repmat(layers,numConvLayers,1);
end

另请参阅

| |

相关主题