Этот пример показывает, как использовать цикл parfor
, чтобы выполнить развертку параметра на опции обучения.
Обучение глубокому обучению часто занимает часы или дни, и поиск хороших опций обучения может быть трудным. С параллельными вычислениями можно убыстриться и автоматизировать поиск хороших моделей. Если у вас есть доступ к машине с несколькими графическими блоками обработки (графические процессоры), можно завершить этот пример на локальной копии набора данных с локальным parpool. Если вы хотите использовать больше ресурсов, можно увеличить обучение глубокому обучению к облаку. Этот пример показывает, как использовать цикл parfor, чтобы выполнить развертку параметра на опции обучения MiniBatchSize
в кластере в облаке. Можно изменить скрипт, чтобы сделать развертку параметра на любой другой опции обучения. Кроме того, этот пример показывает, как получить обратную связь от рабочих во время вычисления с помощью DataQueue
. Можно также отправить скрипт как пакетное задание к кластеру, таким образом, можно продолжить работать или закрыть MATLAB и выбрать результаты позже. Для получения дополнительной информации смотрите, Отправляют Пакетное задание Глубокого обучения в Кластер (Deep Learning Toolbox).
Прежде чем можно будет запустить этот пример, необходимо сконфигурировать кластер и загрузить данные на облако. В MATLAB можно создать кластеры в облаке непосредственно с Рабочего стола MATLAB. На вкладке Home, в меню Parallel, выбирают Create и Manage Clusters. В Кластерном менеджере по Профилю нажмите Create Cloud Cluster. Также можно использовать MathWorks Cloud Center, чтобы создать и получить доступ, вычисляют кластеры. Для получения дополнительной информации смотрите Начало работы с Центром Облака. В данном примере гарантируйте, что ваш кластер установлен по умолчанию на вкладке MATLAB Home, параллельно> Выбирают Default Cluster. После этого загрузите свои данные на блок Amazon S3 и используйте их непосредственно из MATLAB. Этот пример использует копию набора данных CIFAR-10, который уже хранится в Amazon S3. Для инструкций смотрите Данные о Глубоком обучении Загрузки к Облаку (Deep Learning Toolbox).
Загрузите обучение и наборы тестовых данных от облака с помощью imageDatastore
. Разделите обучающий набор данных в наборы обучения и валидации и сохраните набор тестовых данных, чтобы протестировать лучшую сеть от развертки параметра. В этом примере вы используете копию набора данных CIFAR-10, сохраненного в Amazon S3. Чтобы гарантировать, что у рабочих есть доступ к datastore в облаке, убедитесь, что переменные окружения для учетных данных AWS установлены правильно. Смотрите Данные о Глубоком обучении Загрузки к Облаку (Deep Learning Toolbox).
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