В этом примере показано, как обучить использование сверточной нейронной сети MATLAB автоматическая поддержка параллельного обучения. Обучение глубокому обучению часто занимает часы или дни. С параллельными вычислениями можно ускорить обучение с помощью нескольких графических блоков обработки (графические процессоры) локально или в кластере в облаке. Если у вас есть доступ к машине с помощью нескольких графических процессоров, то можно завершить этот пример на локальной копии данных. Если вы хотите использовать больше ресурсов, то можно увеличить обучение глубокому обучению к облаку. Чтобы узнать больше о ваших опциях для параллельного обучения, смотрите, Увеличивают Глубокое обучение в параллели и в облаке. Этот пример проводит вас по шагам, чтобы обучить нейронную сеть для глубокого обучения в кластере в использовании облака MATLAB автоматическая параллельная поддержка.
Прежде чем можно будет запустить пример, необходимо сконфигурировать кластер и данные о загрузке к облаку. В MATLAB можно создать кластеры в облаке непосредственно с Рабочего стола MATLAB. На вкладке Home, в меню Parallel, выбирают Create и Manage Clusters. В Кластерном менеджере по Профилю нажмите Create Cloud Cluster. В качестве альтернативы можно использовать MathWorks Cloud Center, чтобы создать и получить доступ, вычисляют кластеры. Для получения дополнительной информации смотрите Начало работы с Центром Облака. После этого загрузите свои данные на блок Amazon S3 и получите доступ к ним непосредственно из MATLAB. Этот пример использует копию набора данных CIFAR-10, который уже хранится в Amazon S3. Для инструкций смотрите Данные о Глубоком обучении Загрузки к Облаку.
Запустите параллельный пул в кластере и определите номер рабочих к количеству графических процессоров в вашем кластере. Если вы задаете больше рабочих, чем графические процессоры, то остающиеся рабочие неактивны. Этот пример принимает, что кластер, который вы используете, установлен как кластерный профиль по умолчанию. Проверяйте, что кластерный профиль по умолчанию на вкладке MATLAB Home, параллельно> Выбирают Default Cluster.
numberOfWorkers = 8; parpool(numberOfWorkers);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ... connected to 8 workers.
Загрузите обучение и наборы тестовых данных от облака с помощью imageDatastore
. В этом примере вы используете копию набора данных CIFAR-10, сохраненного в Amazon S3. Чтобы гарантировать, что у рабочих есть доступ к datastore в облаке, убедитесь, что переменные окружения для учетных данных AWS установлены правильно. Смотрите Данные о Глубоком обучении Загрузки к Облаку.
imdsTrain = imageDatastore('s3://cifar10cloud/cifar10/train', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); imdsTest = imageDatastore('s3://cifar10cloud/cifar10/test', ... '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, ... 'OutputSizeMode','randcrop');
Задайте сетевую архитектуру для набора данных 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 ];
Задайте опции обучения. Обучите сеть в параллели с помощью текущего кластера путем установки среды выполнения на parallel
. Когда вы используете несколько графических процессоров, вы увеличиваете доступные вычислительные ресурсы. Увеличьте мини-пакетный размер с количеством графических процессоров, чтобы сохранить рабочую нагрузку на каждом графическом процессоре постоянной. Масштабируйте темп обучения согласно мини-пакетному размеру. Используйте расписание темпа обучения, чтобы пропустить темп обучения, в то время как обучение прогрессирует. Включите график процесса обучения получить визуальную обратную связь во время обучения.
miniBatchSize = 256 * numberOfWorkers; initialLearnRate = 1e-1 * miniBatchSize/256; options = trainingOptions('sgdm', ... 'ExecutionEnvironment','parallel', ... % Turn on automatic parallel 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',50, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsTest, ... 'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',45);
Обучите сеть в кластере. Во время обучения график отображает прогресс.
net = trainNetwork(augmentedImdsTrain,layers,options)
net = SeriesNetwork with properties: Layers: [43×1 nnet.cnn.layer.Layer]
Определите точность сети, при помощи обучившего сеть, чтобы классифицировать тестовые изображения на вашей локальной машине. Затем сравните предсказанные метки с фактическими метками.
YPredicted = classify(net,imdsTest); accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
Задайте функцию, чтобы создать сверточный блок в сетевой архитектуре.
function layers = convolutionalBlock(numFilters,numConvLayers) layers = [ convolution2dLayer(3,numFilters,'Padding','same') batchNormalizationLayer reluLayer ]; layers = repmat(layers,numConvLayers,1); end
imageDatastore
| trainNetwork
| trainingOptions