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

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

Требования

Прежде чем можно будет запустить пример, необходимо сконфигурировать кластер и данные о загрузке к облаку. В MATLAB можно создать кластеры в облаке непосредственно с Рабочего стола MATLAB. На вкладке Home, в меню Parallel, выбирают Create и Manage Clusters. В Кластерном менеджере по Профилю нажмите Create Cloud Cluster. В качестве альтернативы можно использовать MathWorks Cloud Center, чтобы создать и получить доступ, вычисляют кластеры. Для получения дополнительной информации смотрите Начало работы с Центром Облака. После этого загрузите свои данные на блок Amazon S3 и получите доступ к ним непосредственно из MATLAB. Этот пример использует копию набора данных CIFAR-10, который уже хранится в Amazon S3. Для инструкций смотрите Данные о Глубоком обучении Загрузки к Облаку.

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

Запустите параллельный пул в кластере и определите номер рабочих к количеству графических процессоров в вашем кластере. Если вы задаете больше рабочих, чем графические процессоры, то остающиеся рабочие неактивны. Этот пример принимает, что кластер, который вы используете, установлен как кластерный профиль по умолчанию. Проверяйте, что кластерный профиль по умолчанию на вкладке MATLAB Home, параллельно> Выбирают 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');

Архитектура сети Define и опции обучения

Задайте сетевую архитектуру для набора данных 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

Смотрите также

| |

Похожие темы