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