exponenta event banner

Параллельно тренировать сети глубокого обучения

В этом примере показано, как выполнять несколько экспериментов глубокого обучения на локальном компьютере. Используя этот пример в качестве шаблона, можно изменить сетевые уровни и параметры обучения в соответствии с конкретными потребностями приложения. Этот подход можно использовать с одним или несколькими графическими процессорами. Если имеется один графический процессор, сети один за другим тренируются в фоновом режиме. Подход, описанный в этом примере, позволяет продолжать использовать MATLAB ® во время проведения экспериментов глубокого обучения.

В качестве альтернативы можно использовать Experiment Manager для интерактивного параллельного обучения нескольких глубоких сетей. Дополнительные сведения см. в разделе Использование диспетчера экспериментов для параллельного обучения сетей.

Подготовка набора данных

Перед запуском примера необходимо получить доступ к локальной копии набора данных глубокого обучения. В этом примере используется набор данных с синтетическими изображениями цифр от 0 до 9. В следующем коде измените местоположение, чтобы указать на набор данных.

datasetLocation = fullfile(matlabroot,'toolbox','nnet', ...
    'nndemos','nndatasets','DigitDataset');

Если необходимо запустить эксперименты с большим количеством ресурсов, можно выполнить этот пример в кластере в облаке.

  • Загрузите набор данных в ведро Amazon S3. Пример см. в разделе Загрузка данных глубокого обучения в облако (панель инструментов параллельных вычислений).

  • Создание облачного кластера. В MATLAB кластеры в облаке можно создавать непосредственно с рабочего стола MATLAB. Дополнительные сведения см. в разделе Создание облачного кластера (панель инструментов параллельных вычислений).

  • Выберите облачный кластер по умолчанию на вкладке Главная в разделе Среда выберите Параллельный > Выбрать кластер по умолчанию.

Загрузить набор данных

Загрузите набор данных с помощью imageDatastore объект. Разбейте набор данных на обучающие, проверочные и тестовые наборы.

imds = imageDatastore(datasetLocation, ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.8,0.1);

Чтобы обучить сеть дополненным данным изображения, создайте augmentedImageDatastore. Используйте случайные переводы и горизонтальные отражения. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.

imageSize = [28 28 1];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    'DataAugmentation',imageAugmenter);

Параллельные сети поездов

Запустите параллельный пул с таким количеством работников, как GPU. Количество доступных графических процессоров можно проверить с помощью gpuDeviceCount (Панель параллельных вычислений). MATLAB назначает отдельный графический процессор каждому работнику. По умолчанию parpool использует профиль кластера по умолчанию. Если значение по умолчанию не было изменено, оно равно local. Этот пример был выполнен на компьютере с 2 графическими процессорами.

numGPUs = gpuDeviceCount("available");
parpool(numGPUs);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).

Для отправки информации о ходе обучения от работников во время обучения используйте parallel.pool.DataQueue (Панель параллельных вычислений). Дополнительные сведения об использовании очередей данных для получения обратной связи во время обучения см. в примере Использование parfeval для обучения нескольким сетям глубокого обучения (Parallel Computing Toolbox).

dataqueue = parallel.pool.DataQueue;

Определите сетевые уровни и параметры обучения. Для удобочитаемости кода их можно определить в отдельной функции, которая возвращает несколько сетевых архитектур и вариантов обучения. В этом случае networkLayersAndOptions возвращает массив ячеек сетевых уровней и массив вариантов обучения одинаковой длины. Откройте этот пример в MATLAB и нажмите networkLayersAndOptions для открытия вспомогательной функции networkLayersAndOptions. Вставка в собственные сетевые слои и параметры. Файл содержит примеры параметров обучения, которые показывают, как отправлять информацию в очередь данных с помощью функции вывода.

[layersCell,options] = networkLayersAndOptions(augmentedImdsTrain,imdsValidation,dataqueue);

Подготовьте графики хода обучения и установите функцию обратного вызова для обновления этих графиков после того, как каждый работник отправит данные в очередь. preparePlots и updatePlots являются вспомогательными функциями для этого примера.

handles = preparePlots(numel(layersCell));

afterEach(dataqueue,@(data) updatePlots(handles,data));

Чтобы сохранить результаты вычислений в параллельных рабочих, используйте будущие объекты. Предварительно назначьте массив будущих объектов для результата каждого обучения.

trainingFuture(1:numel(layersCell)) = parallel.FevalFuture;

Закольцовывать сетевые уровни и параметры с помощью for шлейф и использование parfeval(Панель инструментов параллельных вычислений) для обучения сетей параллельному работнику. Запрос двух выходных аргументов trainNetwork, указать 2 в качестве второго входного аргумента для parfeval.

for i=1:numel(layersCell)
    trainingFuture(i) = parfeval(@trainNetwork,2,augmentedImdsTrain,layersCell{i},options(i));
end

parfeval не блокирует MATLAB, поэтому можно продолжать работу во время выполнения вычислений.

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

[network,trainingInfo] = fetchOutputs(trainingFuture);

Сохранение результатов на диск с помощью save функция. Чтобы загрузить результаты позже, используйте load функция. Использовать sprintf и datetime для присвоения имени файлу с использованием текущей даты и времени.

filename = sprintf('experiment-%s',datetime('now','Format','yyyyMMdd''T''HHmmss'));
save(filename,'network','trainingInfo');

Результаты графика

После завершения обучения в сетях выполните график хода обучения с использованием информации в разделе trainingInfo.

Используйте вложенные графики для распределения различных графиков для каждой сети. В этом примере используйте первую строку вложенных графиков для построения графика точности обучения по количеству периодов и точности проверки.

figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]);
title('Training Progress Plots');

for i=1:numel(layersCell)
    subplot(2,numel(layersCell),i);
    hold on; grid on;
    ylim([0 100]);
    iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);
    epoch = (1:numel(trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;
    plot(epoch,trainingInfo(i).TrainingAccuracy);
    plot(epoch,trainingInfo(i).ValidationAccuracy,'.k','MarkerSize',10);
end
subplot(2,numel(layersCell),1), ylabel('Accuracy');

Затем с помощью второй строки вложенных графиков постройте график тренировочных потерь по количеству периодов вместе с проверочными потерями.

for i=1:numel(layersCell)
    subplot(2,numel(layersCell),numel(layersCell) + i);
    hold on; grid on;
    ylim([0 max([trainingInfo.TrainingLoss])]);
    iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);
    epoch = (1:numel(trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;
    plot(epoch,trainingInfo(i).TrainingLoss);
    plot(epoch,trainingInfo(i).ValidationLoss,'.k','MarkerSize',10);
    xlabel('Epoch');
end
subplot(2,numel(layersCell),numel(layersCell)+1), ylabel('Loss');

После выбора сети можно использовать classify и получить его точность по данным испытаний imdsTest.

См. также

| | | | | (параллельный вычислительный комплект инструментов) | (Панель инструментов параллельных вычислений)

Связанные примеры

Подробнее