Обучите нейронные сети для глубокого обучения параллельно

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

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

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

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

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

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

  • Загрузите набор данных на блок Amazon S3. Для примера смотрите Данные о Глубоком обучении Загрузки к Облаку.

  • Создайте кластер облака. В MATLAB можно создать кластеры в облаке непосредственно с Рабочего стола MATLAB. Для получения дополнительной информации смотрите, Создают Кластер Облака (Parallel Computing Toolbox).

  • Выберите свой кластер облака как значение по умолчанию, на вкладке Home, в разделе Environment, выберите Parallel> Select a Default Cluster.

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

Загрузите набор данных при помощи 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);

Обучите нейронные сети параллельно

Начните параллельный пул со стольких же рабочих сколько графические процессоры. Можно проверять количество доступных графических процессоров при помощи gpuDeviceCount (Parallel Computing Toolbox) функция. 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 Объект (Parallel Computing Toolbox). Чтобы узнать больше, как использовать очереди данных, чтобы получить обратную связь во время обучения, смотрите Использование в качестве примера parfeval, чтобы Обучить Несколько Нейронных сетей для глубокого обучения.

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 (Parallel Computing Toolbox), чтобы обучить сети на параллельном рабочем. Запрашивать два выходных аргумента от 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.

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

| | | (Parallel Computing Toolbox) | | |

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

Больше о