В этом примере показано, как создать и обучить простую сверточную нейронную сеть классификации глубокого обучения. Сверточные нейронные сети являются особыми инструментами для глубокого обучения и особенно подходят для распознавания изображений.
Пример демонстрирует как:
Загрузите и исследуйте данные изображения.
Определить сетевую архитектуру.
Задайте опции обучения.
Обучите сеть.
Предскажите метки новых данных и вычислите точность классификации.
Загрузите выборочные данные цифры как 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');
Задайте архитектуру сверточной нейронной сети.
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
analyzeNetwork
| Deep Network Designer | trainingOptions
| trainNetwork