В этом примере показано, как использовать parfor цикл для выполнения сдвига параметров для опции обучения.
Глубокое обучение часто занимает часы или дни, и поиск хороших вариантов обучения может быть затруднен. Параллельные вычисления позволяют ускорить и автоматизировать поиск хороших моделей. Если имеется доступ к машине с несколькими графическими блоками обработки (GPU), можно завершить этот пример на локальной копии набора данных с помощью локального парпула. Если вы хотите использовать больше ресурсов, вы можете масштабировать углубленное обучение в облаке. В этом примере показано, как использовать цикл parfor для выполнения сдвига параметров для опции обучения. MiniBatchSize в кластере в облаке. Можно изменить сценарий, чтобы выполнить сдвиг параметров для любого другого варианта обучения. Кроме того, в этом примере показано, как получить обратную связь от работников во время вычислений с использованием DataQueue. Можно также отправить сценарий в кластер как пакетное задание, чтобы продолжить работу или закрыть MATLAB и получить результаты позже. Дополнительные сведения см. в разделе Отправка пакетного задания глубокого обучения в кластер (панель инструментов глубокого обучения).
Перед запуском этого примера необходимо настроить кластер и загрузить данные в облако. В MATLAB кластеры в облаке можно создавать непосредственно с рабочего стола MATLAB. На вкладке Главная в меню Параллельный выберите Создать кластеры и управление ими. В диспетчере профилей кластера щелкните Создать облачный кластер. Можно также использовать Cloud Center MathWorks для создания вычислительных кластеров и доступа к ним. Дополнительные сведения см. в разделе Начало работы с облачным центром. В этом примере убедитесь, что кластер установлен по умолчанию на вкладке Главная страница MATLAB (Parallel > Select a Default Cluster). После этого загрузите данные в ведро Amazon S3 и используйте их непосредственно из MATLAB. В этом примере используется копия набора данных CIFAR-10, который уже хранится в Amazon S3. Инструкции см. в разделе Загрузка данных глубокого обучения в облако (инструментарий глубокого обучения).
Загрузка обучающих и тестовых наборов данных из облака с помощью imageDatastore. Разбейте набор обучающих данных на наборы обучающих и валидационных данных и сохраните набор тестовых данных, чтобы проверить лучшую сеть из параметров sweep. В этом примере используется копия набора данных CIFAR-10, хранящегося в Amazon S3. Чтобы гарантировать, что работники имеют доступ к хранилищу данных в облаке, убедитесь, что переменные среды для учетных данных AWS заданы правильно. См. раздел Загрузка данных глубокого обучения в облако (инструментарий глубокого обучения).
imds = imageDatastore('s3://cifar10cloud/cifar10/train', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); imdsTest = imageDatastore('s3://cifar10cloud/cifar10/test', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);
Обучение сети с дополненными данными изображения путем создания 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 набора данных. Чтобы упростить код, используйте сверточные блоки, которые свернут вход. Слои объединения уменьшают пространственные размеры.
imageSize = [32 32 3]; netDepth = 2; % netDepth controls the depth of a convolutional block netWidth = 16; % netWidth controls the number of filters in a convolutional block layers = [ imageInputLayer(imageSize) convolutionalBlock(netWidth,netDepth) maxPooling2dLayer(2,'Stride',2) convolutionalBlock(2*netWidth,netDepth) maxPooling2dLayer(2,'Stride',2) convolutionalBlock(4*netWidth,netDepth) averagePooling2dLayer(8) fullyConnectedLayer(10) softmaxLayer classificationLayer ];
Укажите размеры мини-партии, для которой требуется выполнить сдвиг параметра. Назначение переменных для результирующих сетей и точности.
miniBatchSizes = [64 128 256 512]; numMiniBatchSizes = numel(miniBatchSizes); trainedNetworks = cell(numMiniBatchSizes,1); accuracies = zeros(numMiniBatchSizes,1);
Выполнение обучения параллельным параметрам для нескольких сетей внутри parfor цикл и изменение размера мини-партии. Работники кластера обучают сети одновременно и отправляют обученные сети и точности обратно по завершении обучения. Если вы хотите проверить, что обучение работает, установите Verbose кому true в вариантах обучения. Обратите внимание, что рабочие вычисляются независимо, поэтому выходные данные командной строки не находятся в том же последовательном порядке, что и итерации.
parfor idx = 1:numMiniBatchSizes miniBatchSize = miniBatchSizes(idx); initialLearnRate = 1e-1 * miniBatchSize/256; % Scale the learning rate according to the mini-batch size. % Define the training options. Set the mini-batch size. options = trainingOptions('sgdm', ... 'MiniBatchSize',miniBatchSize, ... % Set the corresponding MiniBatchSize in the sweep. 'Verbose',false, ... % Do not send command line output. 'InitialLearnRate',initialLearnRate, ... % Set the scaled learning rate. 'L2Regularization',1e-10, ... 'MaxEpochs',30, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsValidation, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',25); % Train the network in a worker in the cluster. net = trainNetwork(augmentedImdsTrain,layers,options); % To obtain the accuracy of this network, use the trained network to % classify the validation images on the worker and compare the predicted labels to the % actual labels. YPredicted = classify(net,imdsValidation); accuracies(idx) = sum(YPredicted == imdsValidation.Labels)/numel(imdsValidation.Labels); % Send the trained network back to the client. trainedNetworks{idx} = net; end
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ... Connected to the parallel pool (number of workers: 4).
После parfor отделка, trainedNetworks содержит результирующие сети, обученные рабочими. Отображение обученных сетей и их точности.
trainedNetworks
trainedNetworks = 4×1 cell array
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
accuracies
accuracies = 4×1
0.8188
0.8232
0.8162
0.8050
Выберите лучшую сеть с точки зрения точности. Проверьте его производительность по набору тестовых данных.
[~, I] = max(accuracies);
bestNetwork = trainedNetworks{I(1)};
YPredicted = classify(bestNetwork,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)accuracy = 0.8173
Подготовьте и инициализируйте графики, показывающие ход обучения каждого из работников. Использовать animatedLine удобный способ отображения изменяющихся данных.
f = figure; f.Visible = true; for i=1:4 subplot(2,2,i) xlabel('Iteration'); ylabel('Training accuracy'); lines(i) = animatedline; end

Отправка данных о ходе обучения от работников клиенту с помощью DataQueue, а затем постройте график данных. Обновлять графики каждый раз, когда работники отправляют отзыв о ходе обучения с помощью afterEach. Параметр opts содержит сведения о работнике, итерации обучения и точности обучения.
D = parallel.pool.DataQueue;
afterEach(D, @(opts) updatePlot(lines, opts{:}));Выполните параллельную проверку параметров, обучая несколько сетей внутри цикла parfor с различными размерами мини-партии. Обратите внимание на использование OutputFcn в параметрах обучения, чтобы отправить ход обучения клиенту каждую итерацию. На этом рисунке показан ход обучения четырех различных работников во время выполнения следующего кода.

parfor idx = 1:numel(miniBatchSizes) miniBatchSize = miniBatchSizes(idx); initialLearnRate = 1e-1 * miniBatchSize/256; % Scale the learning rate according to the miniBatchSize. % Define the training options. Set an output function to send data back % to the client each iteration. options = trainingOptions('sgdm', ... 'MiniBatchSize',miniBatchSize, ... % Set the corresponding MiniBatchSize in the sweep. 'Verbose',false, ... % Do not send command line output. 'InitialLearnRate',initialLearnRate, ... % Set the scaled learning rate. 'OutputFcn',@(state) sendTrainingProgress(D,idx,state), ... % Set an output function to send intermediate results to the client. 'L2Regularization',1e-10, ... 'MaxEpochs',30, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsValidation, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',25); % Train the network in a worker in the cluster. The workers send % training progress information during training to the client. net = trainNetwork(augmentedImdsTrain,layers,options); % To obtain the accuracy of this network, use the trained network to % classify the validation images on the worker and compare the predicted labels to the % actual labels. YPredicted = classify(net,imdsValidation); accuracies(idx) = sum(YPredicted == imdsValidation.Labels)/numel(imdsValidation.Labels); % Send the trained network back to the client. trainedNetworks{idx} = net; end
Analyzing and transferring files to the workers ...done.
После parfor отделка, trainedNetworks содержит результирующие сети, обученные рабочими. Отображение обученных сетей и их точности.
trainedNetworks
trainedNetworks = 4×1 cell array
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
{1×1 SeriesNetwork}
accuracies
accuracies = 4×1
0.8214
0.8172
0.8132
0.8084
Выберите лучшую сеть с точки зрения точности. Проверьте его производительность по набору тестовых данных.
[~, I] = max(accuracies);
bestNetwork = trainedNetworks{I(1)};
YPredicted = classify(bestNetwork,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)accuracy = 0.8187
Определите функцию для создания сверточного блока в сетевой архитектуре.
function layers = convolutionalBlock(numFilters,numConvLayers) layers = [ convolution2dLayer(3,numFilters,'Padding','same') batchNormalizationLayer reluLayer ]; layers = repmat(layers,numConvLayers,1); end
Определение функции для отправки данных о ходе обучения клиенту через DataQueue.
function sendTrainingProgress(D,idx,info) if info.State == "iteration" send(D,{idx,info.Iteration,info.TrainingAccuracy}); end end
Определите функцию обновления для обновления графиков при отправке работником промежуточного результата.
function updatePlot(lines,idx,iter,acc) addpoints(lines(idx),iter,acc); drawnow limitrate nocallbacks end
imageDatastore | parallel.pool.DataQueue | trainNetwork (инструментарий для глубокого обучения)