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

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

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

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

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

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

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

  • Спрогнозируйте метки новых данных и вычислите точность классификации.

Пример, показывающий интерактивное создание и обучение простой сети классификации изображений, см. в разделе Создание простой сети классификации изображений с использованием Deep Network Designer.

Загрузка и исследование данных

Загрузите цифру выборочных данных как изображение datastore. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные как ImageDatastore объект. image 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 содержит 1000 изображений для каждой из цифр 0-9, в общей сложности 10000 изображений. Количество классов на последнем полностью подключенном слое сети можно задать как 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');

Определение сетевой архитектуры

Определите архитектуру сверточной нейронной сети.

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];

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

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

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

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

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

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

Softmax Layer Функция активации 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™ и поддерживаемое устройство GPU. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Можно также задать окружение выполнения с помощью 'ExecutionEnvironment' Аргумент пары "имя-значение" из trainingOptions.

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

net = trainNetwork(imdsTrain,layers,options);

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

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

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

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

См. также

| | |

Похожие темы