Этот пример показывает, как использовать несколько графических процессоров на вашей локальной машине для обучения глубокому обучению использование автоматической параллельной поддержки. Учебные нейронные сети для глубокого обучения часто занимают часы или дни. С параллельными вычислениями можно ускорить обучение с помощью нескольких графических процессоров. Чтобы узнать больше об опциях для параллельного обучения, смотрите, Увеличивают Глубокое обучение параллельно и в Облаке (Deep Learning Toolbox).
Прежде чем можно будет запустить этот пример, необходимо загрузить набор данных CIFAR-10 на локальную машину. Следующий код загружает набор данных на ваш текущий каталог. Если у вас уже есть локальная копия CIFAR-10, то можно пропустить этот раздел.
directory = pwd; [locationCifar10Train,locationCifar10Test] = downloadCIFARToFolders(directory);
Downloading CIFAR-10 data set...done. Copying CIFAR-10 to folders...done.
Загрузите обучение и наборы тестовых данных при помощи объекта imageDatastore
. В следующем коде гарантируйте, что местоположение хранилищ данных указывает на CIFAR-10 в вашей локальной машине.
imdsTrain = imageDatastore(locationCifar10Train, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); imdsTest = imageDatastore(locationCifar10Test, ... '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);
Задайте сетевую архитектуру для набора данных 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 ];
Задайте опции обучения. Обучите сеть параллельно с несколькими графическими процессорами путем установки среды выполнения на 'multi-gpu'
. Когда вы используете несколько графических процессоров, вы увеличиваете доступные вычислительные ресурсы. Увеличьте мини-пакетный размер с количеством графических процессоров, чтобы сохранить рабочую нагрузку на каждом графическом процессоре постоянной. В этом примере количество графических процессоров равняется двум. Масштабируйте темп обучения согласно мини-пакетному размеру. Используйте расписание темпа обучения, чтобы пропустить темп обучения, в то время как обучение прогрессирует. Включите учебный график прогресса получить визуальную обратную связь во время обучения.
numGPUs = 2; miniBatchSize = 256*numGPUs; initialLearnRate = 1e-1*miniBatchSize/256; options = trainingOptions('sgdm', ... 'ExecutionEnvironment','multi-gpu', ... % Turn on automatic multi-gpu 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',60, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsTest, ... 'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',50);
Обучите сеть. Во время обучения график отображает прогресс.
net = trainNetwork(augmentedImdsTrain,layers,options)
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 2).
net = SeriesNetwork with properties: Layers: [43×1 nnet.cnn.layer.Layer]
Определите точность сети при помощи обучившего сеть, чтобы классифицировать тестовые изображения на вашей локальной машине. Затем сравните предсказанные метки с фактическими метками.
YPredicted = classify(net,imdsTest); accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
accuracy = 0.8779
Автоматическая поддержка мультиграфического процессора может ускорить сетевое обучение путем использования в своих интересах нескольких графических процессоров. Следующий график показывает ускорение в полное учебное время с количеством графических процессоров на машине Linux с четырьмя NVIDIA© TITAN Xp графические процессоры.
Задайте функцию, чтобы создать сверточный блок в сетевой архитектуре.
function layers = convolutionalBlock(numFilters,numConvLayers) layers = [ convolution2dLayer(3,numFilters,'Padding','same') batchNormalizationLayer reluLayer]; layers = repmat(layers,numConvLayers,1); end
imageDatastore
| trainNetwork
| trainingOptions