Создайте простую сеть глубокого обучения для классификации

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

Пример демонстрирует как:

  • Загрузите и исследуйте данные изображения.

  • Определить сетевую архитектуру.

  • Задайте опции обучения.

  • Обучите сеть.

  • Предскажите метки новых данных и вычислите точность классификации.

Загрузите и исследуйте данные изображения

Загрузите выборочные данные цифры как datastore изображений. imageDatastore автоматически маркирует изображения на основе имен папок и хранит данные как объект ImageDatastore. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти, и эффективно считать пакеты изображений во время обучения сверточной нейронной сети.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true,'LabelSource','foldernames');

Отобразите некоторые изображения в datastore.

figure;
perm = randperm(10000,20);
for i = 1:20
    subplot(4,5,i);
    imshow(imds.Files{perm(i)});
end

Вычислите количество изображений в каждой категории. labelCount является таблицей, которая содержит метки и количество изображений, имеющих каждую метку. Datastore содержит 1 000 изображений для каждой из цифр 0-9 для в общей сложности 10 000 изображений. Можно задать количество классов в последнем полносвязном слое сети в качестве аргумента OutputSize.

labelCount = countEachLabel(imds)
labelCount=10×2 table
    Label    Count
    _____    _____

      0      1000 
      1      1000 
      2      1000 
      3      1000 
      4      1000 
      5      1000 
      6      1000 
      7      1000 
      8      1000 
      9      1000 

Необходимо задать размер изображений во входном слое сети. Проверяйте размер первого изображения в digitData. Каждое изображение 28 28 на 1 пиксель.

img = readimage(imds,1);
size(img)
ans = 1×2

    28    28

Задайте наборы обучения и валидации

Разделите данные на наборы данных обучения и валидации, так, чтобы каждая категория в наборе обучающих данных содержала 750 изображений, и набор валидации содержит остающиеся изображения от каждой метки. splitEachLabel разделяет datastore digitData в два новых хранилища данных, trainDigitData и valDigitData.

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');

Архитектура сети Define

Задайте сверточную архитектуру нейронной сети.

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Отобразите Входной Слой, который - imageInputLayer то, где вы задаете размер изображения, который, в этом случае, является 28 28 1. Эти числа соответствуют высоте, ширине и размеру канала. Данные о цифре состоят из полутоновых изображений, таким образом, размер канала (цветовой канал) равняется 1. Для цветного изображения размер канала равняется 3, соответствуя значениям RGB. Вы не должны переставлять данные, потому что trainNetwork, по умолчанию, переставляет данные в начале обучения. trainNetwork может также автоматически переставить данные в начале каждой эпохи во время обучения.

Сверточный Слой В сверточном слое, первым аргументом является filterSize, который является высотой и шириной фильтров учебное функциональное использование при сканировании вдоль изображений. В этом примере номер 3 указывает, что размер фильтра имеет размер 3х3. Можно задать различные размеры для высоты и ширины фильтра. Второй аргумент является количеством фильтров, numFilters, который является количеством нейронов, которые соединяются с той же областью входа. Этот параметр определяет количество карт функции. Используйте пару "имя-значение" 'Padding', чтобы добавить дополнение во входную карту функции. Для сверточного слоя шагом по умолчанию 1, дополнение 'same' гарантирует, что пространственный выходной размер совпадает с входным размером. Можно также задать шаг и темпы обучения для этого использования слоя аргументы пары "имя-значение" convolution2dLayer.

Пакетные слои нормализации Пакета Слоя Нормализации нормируют распространение активаций и градиентов через сеть, делая сетевое обучение более легкой задачей оптимизации. Используйте пакетные слои нормализации между сверточными слоями и нелинейностью, такой как слои ReLU, чтобы ускорить сетевое обучение и уменьшать чувствительность к сетевой инициализации. Используйте batchNormalizationLayer, чтобы создать пакетный слой нормализации.

Слой ReLU пакетный слой нормализации сопровождается нелинейной функцией активации. Наиболее распространенная функция активации является исправленным линейным модулем (ReLU). Используйте reluLayer, чтобы создать слой ReLU.

Слои Max Pooling Layer Convolutional (с функциями активации) иногда сопровождаются операцией субдискретизации, которая уменьшает пространственный размер карты функции и удаляет избыточную пространственную информацию. Субдискретизация позволяет увеличить число, просачивается более глубокие сверточные слои, не увеличивая необходимое количество вычисления на слой. Один способ субдискретизировать использует макс. объединение, которое вы создаете использование maxPooling2dLayer. Макс. слой объединения возвращает максимальные значения прямоугольных областей входных параметров, заданных первым аргументом, poolSize. В этом примере размер прямоугольной области [2,2]. Аргумент пары "имя-значение" 'Stride' задает размер шага, который берет учебная функция, когда это сканирует вдоль входа.

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

Слой Softmax softmax функция активации нормирует вывод полносвязного слоя. Вывод softmax слоя состоит из положительных чисел, которые суммируют одному, который может затем использоваться в качестве вероятностей классификации слоем классификации. Создайте softmax слой с помощью функции softmaxLayer после последнего полносвязного слоя.

Слой классификации последний слой является слоем классификации. Этот слой использует вероятности, возвращенные softmax функцией активации для каждого входа, чтобы присвоить вход одному из взаимоисключающих классов и вычислить потерю. Чтобы создать слой классификации, используйте classificationLayer.

Задайте опции обучения

После определения сетевой структуры задайте опции обучения. Обучите сеть с помощью стохастического спуска градиента с импульсом (SGDM) с начальным темпом обучения 0,01. Определите максимальный номер эпох к 4. Эпоха является полным учебным циклом на целом обучающем наборе данных. Контролируйте сетевую точность во время обучения путем определения данных о валидации и частоты валидации. Переставьте данные каждая эпоха. Программное обеспечение обучает сеть на данных тренировки и вычисляет точность на данные о валидации равномерно во время обучения. Данные о валидации не используются, чтобы обновить сетевые веса. Включите учебный график прогресса и выключите командное окно вывод.

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучите сеть Используя данные тренировки

Обучите сеть с помощью архитектуры, заданной layers, данными тренировки и опциями обучения. По умолчанию trainNetwork использует графический процессор, если вы доступны (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В противном случае это использует центральный процессор. Можно также задать среду выполнения при помощи аргумента пары "имя-значение" 'ExecutionEnvironment' trainingOptions.

Учебный график прогресса показывает мини-пакетную потерю и точность и потерю валидации и точность. Для получения дополнительной информации об учебном графике прогресса смотрите Прогресс Обучения Глубокому обучению Монитора. Потеря является перекрестной энтропийной потерей. Точность является процентом изображений, которые сеть классифицирует правильно.

net = trainNetwork(imdsTrain,layers,options);

Классифицируйте изображения валидации и вычислите точность

Предскажите метки данных о валидации с помощью обучившего сеть, и вычислите итоговую точность валидации. Точность является частью меток, которые сеть предсказывает правильно. В этом случае больше чем 99% предсказанных меток совпадают с истинными метками набора валидации.

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;

accuracy = sum(YPred == YValidation)/numel(YValidation)
accuracy = 0.9920

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

| |

Похожие темы