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

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

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

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

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

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

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

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

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

Загрузите выборочные данные цифры как 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.9988

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

| | |

Похожие темы