Обучите сеть в облаке с помощью автоматической параллельной поддержки

В этом примере показано, как обучить сверточную нейронную сеть с помощью автоматической поддержки MATLAB для параллельного обучения. Обучение глубокому обучению часто занимает часы или дни. С помощью параллельных вычислений можно ускорить обучение с помощью нескольких графических модулей (GPU) локально или в кластере в облаке. Если у вас есть доступ к машине с несколькими графическими процессорами, то можно завершить этот пример на локальной копии данных. Если вы хотите использовать больше ресурсов, то можно масштабировать обучение глубокого обучения до облака. Дополнительные сведения о опциях параллельного обучения см. в разделе Шкале глубокого обучения параллельно и в облаке. Этот пример проведет вас через шаги, чтобы обучить нейронную сеть для глубокого обучения в кластере в облаке с помощью автоматической параллельной поддержки MATLAB.

Требования

Прежде чем вы сможете запустить пример, вам нужно сконфигурировать кластер и загрузить данные в облако. В MATLAB можно создавать кластеры в облаке непосредственно с рабочего стола MATLAB. На вкладке «Вкладке Home», в меню Parallel, выберите Create and Manage Clusters. В Диспетчере профилей кластеров щелкните Создать облако. Также можно использовать MathWorks Cloud Center для создания и доступа к вычислительным кластерам. Дополнительные сведения см. в разделе Начало работы с облачным центром. После этого загрузите свои данные в блок S3 Amazon и получите к ним доступ непосредственно из MATLAB. Этот пример использует копию CIFAR-10 набора данных, который уже хранится в Amazon S3. Инструкции см. в разделе Загрузка данных глубокого обучения в облако.

Настройка параллельного пула

Запустите параллельный пул в кластере и установите количество рабочих процессов на количество графических процессоров в кластере. Если вы задаете больше работников, чем графические процессоры, то остальные работники находятся в простое. Этот пример предполагает, что используемый кластер установлен в качестве профиля кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке MATLAB Home, в Parallel > Select a Default Cluster.

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

Загрузка набора данных из облака

Загрузите наборы обучающих и тестовых данных из облака с помощью imageDatastore. В этом примере вы используете копию CIFAR-10 набора данных, хранящегося в Amazon S3. Чтобы убедиться, что работники имеют доступ к datastore в облаке, убедитесь, что переменные окружения для учетных данных 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. Когда вы используете несколько графических процессоров, вы увеличиваете доступные вычислительные ресурсы. Увеличьте размер мини-пакета с количеством графических процессоров, чтобы сохранить рабочую нагрузку на каждом графическом процессоре постоянной. Масштабируйте скорость обучения в соответствии с размером мини-пакета. Используйте расписание скорости обучения, чтобы снизить скорость обучения по мере процессов обучения. Включите график процесса обучения, чтобы получить визуальную обратную связь во время обучения.

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

См. также

| |

Похожие темы