Вступление:
Любой, кто хоть немного интересуется информатикой или технологиями в целом, наверняка сталкивался с термином нейронная сеть. Трудно не учитывать шумиху вокруг машинного обучения и искусственного интеллекта.
Итак, что такое нейронная сеть?
«Нейронная сеть - это вычислительная модель, многоуровневая структура которой напоминает сетевую структуру нейронов мозга со слоями связанных узлов. Нейронная сеть может учиться на данных, чтобы ее можно было обучить распознавать закономерности, классифицировать данные и прогнозировать будущие события ».- Сотрудники Mathworks
Я скажу вам лучше, почему нейронная сеть?
Что ж, оказывается, это перекрестие линейной алгебры и вероятности очень хорошо подходит для распознавания образов, классификации объектов и даже фильтрации сигналов из речей.
Раньше было так, что когда мы пытались заставить машины выполнять сложные задачи, мы пытались сформулировать эту задачу. Вы хотите сделать что-то вроде распознавания лиц, вы захотите закодировать там, как именно можно распознать глазное яблоко, как вы обнаруживаете петли и тому подобное. Позже, когда у нас было все больше и больше компьютерной обработки, мы поняли, нет-нет-нет: Не пытайтесь сформулировать это идеально, просто загрузите как можно больше данных в компьютер. Дайте ему достойную основу для преобразования данных во что-то, что можно экстраполировать, а затем работайте над этим , - Грант Сандерсон
Но позвольте мне остановить вас здесь. Этот блог действительно делает некоторые предположения. Предполагается, что вы знакомы с концепциями машинного обучения и глубокого обучения в целом. Если это не так, сделайте паузу и почитайте, прежде чем продолжить. Когда дело доходит до ресурсов по машинному обучению, Интернет - это пещера сокровищ. Как хороший джедай, вы можете идти своим путем или следовать моим рекомендациям.
Суть глубокого обучения 3 Blue 1 Brown.
Ускоренный курс машинного обучения от разработчиков Google.
Также обратите внимание, что если вы хотите писать код, вам потребуется MATLAB 2018b или выше. Хорошо, теперь, когда мы выпустили наши предупреждения и перечислили предварительные условия. Давайте начнем прямо сейчас.
Набор инструментов для глубокого обучения
Подобно фреймворкам, таким как Tensorflow, Keras или Caffe, MATLAB имеет свою собственную структуру для проектирования, обучения и реализации алгоритмов нейронных сетей.
Он позволяет использовать CNN и LSTM и даже импортировать предварительно обученные модели глубокой сети из Tensorflow, Keras и Caffe. Если вы хотите немного поиграть с набором инструментов, прежде чем мы начнем, просто перейдите в командную строку MATLAB и введите:
>>deepNetworkDesigner
Распознаватель рукописных цифр с использованием сверточной нейронной сети
Как вы уже догадались из названия, мы собираемся построить нейронную сеть для классификации рукописных цифр. Это «привет, мир» глубокого обучения, и для первых шагов это неплохая задача.
В этом проекте мы будем выполнять следующие шаги:
1. Загрузка набора данных изображений
2. Визуализация изображений.
3. Создание сетевой архитектуры.
4. Обучение сеть.
5. Прогнозирование меток на новых данных.
- Загрузка данных изображения
Сначала мы загружаем набор данных 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, - это навык, который может оказаться весьма полезным в долгосрочной перспективе.