Вступление:

Любой, кто хоть немного интересуется информатикой или технологиями в целом, наверняка сталкивался с термином нейронная сеть. Трудно не учитывать шумиху вокруг машинного обучения и искусственного интеллекта.

Итак, что такое нейронная сеть?

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

Я скажу вам лучше, почему нейронная сеть?

Что ж, оказывается, это перекрестие линейной алгебры и вероятности очень хорошо подходит для распознавания образов, классификации объектов и даже фильтрации сигналов из речей.

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

Но позвольте мне остановить вас здесь. Этот блог действительно делает некоторые предположения. Предполагается, что вы знакомы с концепциями машинного обучения и глубокого обучения в целом. Если это не так, сделайте паузу и почитайте, прежде чем продолжить. Когда дело доходит до ресурсов по машинному обучению, Интернет - это пещера сокровищ. Как хороший джедай, вы можете идти своим путем или следовать моим рекомендациям.

Суть глубокого обучения 3 Blue 1 Brown.

Ускоренный курс машинного обучения от разработчиков Google.

Также обратите внимание, что если вы хотите писать код, вам потребуется MATLAB 2018b или выше. Хорошо, теперь, когда мы выпустили наши предупреждения и перечислили предварительные условия. Давайте начнем прямо сейчас.

Набор инструментов для глубокого обучения

Подобно фреймворкам, таким как Tensorflow, Keras или Caffe, MATLAB имеет свою собственную структуру для проектирования, обучения и реализации алгоритмов нейронных сетей.

Он позволяет использовать CNN и LSTM и даже импортировать предварительно обученные модели глубокой сети из Tensorflow, Keras и Caffe. Если вы хотите немного поиграть с набором инструментов, прежде чем мы начнем, просто перейдите в командную строку MATLAB и введите:

>>deepNetworkDesigner

Распознаватель рукописных цифр с использованием сверточной нейронной сети

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

В этом проекте мы будем выполнять следующие шаги:
1. Загрузка набора данных изображений
2. Визуализация изображений.
3. Создание сетевой архитектуры.
4. Обучение сеть.
5. Прогнозирование меток на новых данных.

  1. Загрузка данных изображения
    Сначала мы загружаем набор данных MNIST. Он уже доступен в наборе инструментов глубокого обучения, поэтому нам не нужно загружать набор данных самостоятельно. Просто откройте новый файл MATLAB и напишите:
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');

imageDatastore (__, ’LabelSource’, SOURCE) указывает источник, из которого свойство Labels получает ярлыки. По умолчанию значение SOURCE равно «none». Если SOURCE = «имена папок», то значения свойства Labels берутся из имен папок файлов изображений.

2. Визуализация изображений

figure;
permute = randperm(10000,10);
for i = 1:10
subplot(2,5,i);
imshow(imds.Files{permute(i)});
end

Выбор 10 изображений случайным образом из набора данных 1000 и их отображение. Мы увидим что-то вроде этого:

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

labelCount = countEachLabel(imds)
numTrainFiles = 700;
[imdsTrain,imdsTest] = splitEachLabel(imds,numTrainFiles,'randomize');

3. Создание сетевой архитектуры.

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

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

4. Обучение сети

options = trainingOptions('sgdm', ...
'InitialLearnRate',0.01, ...
'MaxEpochs',4, ...
'Shuffle','every-epoch', ...
'ValidationData',imdsTest, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(imdsTrain,layers,options);

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

Чтобы еще лучше визуализировать вашу сеть, вы можете ввести команду.

analyzeNetwork(net)

5. Прогнозирование ярлыков новых изображений.

YPred = classify(net,imdsTest);
YTest = imdsTest.Labels;
accuracy = sum(YPred == YTest)/numel(YTest)

Мы видим, что точность нашей проверки составляет 99,33%. Вы можете поэкспериментировать с данными и увеличить или уменьшить количество эпох и некоторые другие параметры, чтобы увидеть, как это разыграется. Если ваша система имеет графический процессор, MATLAB будет автоматически использовать его для оптимизации периода обучения.

Я разместил весь код здесь, не стесняйтесь использовать его как хотите.

Резюме

Хотя большинство из нас предвзято относятся к таким языкам, как Python или C ++, когда дело доходит до машинного обучения, само собой разумеется, что MATLAB является важным инструментом для инженеров. Инженеры-электронщики и электрики постоянно запускают MATLAB ради чего-то другого. Знать, как проектировать, обучать и строить нейронную сеть в MATLAB, - это навык, который может оказаться весьма полезным в долгосрочной перспективе.