В этом примере показано, как создать и обучить простую сверточную нейронную сеть для классификации глубокого обучения. Сверточные нейронные сети являются важными инструментами для глубокого обучения и особенно подходят для распознавания изображений.
В примере показано, как:
Загрузка и изучение данных изображения.
Определите архитектуру сети.
Укажите параметры обучения.
Обучение сети.
Спрогнозировать метки новых данных и рассчитать точность классификации.
Пример интерактивного создания и обучения простой сети классификации изображений см. в разделе Создание простой сети классификации изображений с помощью Deep Network Designer.
Загрузите данные образца цифры как хранилище данных изображения. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные в виде ImageDatastore объект. Хранилище данных изображения позволяет хранить большие данные изображения, включая данные, которые не помещаются в память, и эффективно считывать партии изображений во время обучения сверточной нейронной сети.
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ... 'nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, ... 'IncludeSubfolders',true,'LabelSource','foldernames');
Отображение некоторых изображений в хранилище данных.
figure; perm = randperm(10000,20); for i = 1:20 subplot(4,5,i); imshow(imds.Files{perm(i)}); end

Вычислите количество изображений в каждой категории. labelCount - таблица, содержащая метки и количество изображений с каждой меткой. Хранилище данных содержит 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 разделяет хранилище данных 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.
Уровень пакетной нормализации Слои пакетной нормализации нормализуют активации и градиенты, распространяющиеся по сети, что облегчает задачу оптимизации обучения сети. Используйте пакетные уровни нормализации между сверточными уровнями и нелинейными уровнями, такими как уровни ReLU, для ускорения обучения сети и снижения чувствительности к инициализации сети. Использовать batchNormalizationLayer для создания уровня нормализации пакета.
Уровень ReLU За уровнем пакетной нормализации следует нелинейная функция активации. Наиболее распространенной функцией активации является выпрямленный линейный блок (ReLU). Использовать reluLayer для создания слоя ReLU.
За макс. сверточными слоями пулов (с функциями активации) иногда следует операция понижающей дискретизации, которая уменьшает пространственный размер карты элементов и удаляет избыточную пространственную информацию. Понижающая дискретизация позволяет увеличить количество фильтров в более глубоких сверточных слоях без увеличения необходимого количества вычислений на слой. Одним из способов понижающей выборки является использование максимального пула, который создается с помощью 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 использует графический процессор, если он доступен, в противном случае использует центральный процессор. Для обучения графическому процессору требуются параллельные вычислительные Toolbox™ и поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (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 | Конструктор глубоких сетей | trainingOptions | trainNetwork