exponenta event banner

Распознавание символов

Этот пример иллюстрирует, как обучить нейронную сеть выполнять простое распознавание символов.

Определение проблемы

Скрипт prprob определяет матрицу X с 26 столбцами, по одному для каждой буквы алфавита. Каждый столбец имеет 35 значений, которые могут быть либо 1, либо 0. Каждый столбец из 35 значений определяет растровое изображение буквы размером 5x7.

Матрица Т представляет собой единичную матрицу 26х26, которая отображает 26 входных векторов в 26 классов.

[X,T] = prprob;

Здесь A, первая буква, нанесена как битовая карта.

plotchar(X(:,1))

Создание первой нейронной сети

Для решения этой проблемы мы будем использовать нейронную сеть прямой связи, созданную для распознавания образов с 25 скрытыми нейронами.

Поскольку нейронная сеть инициализируется со случайными начальными весами, результаты после обучения незначительно изменяются каждый раз при выполнении примера. Чтобы избежать этой случайности, случайное начальное число настраивается на воспроизведение одних и тех же результатов каждый раз. Это необязательно для собственных приложений.

setdemorandstream(pi);

net1 = feedforwardnet(25);
view(net1)

Обучение первой нейронной сети

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

Обучение прекращается, когда сеть больше не может улучшиться в наборах обучения или проверки.

net1.divideFcn = '';
net1 = train(net1,X,T,nnMATLAB);
 
Computing Resources:
MATLAB on GLNXA64
 

Обучение второй нейронной сети

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

Здесь создается 30 шумных копий каждой буквы Xn. Значения ограничены минимальными и максимальными значениями от 0 до 1. Соответствующие цели Tn также определены.

numNoise = 30;
Xn = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*0.2,0),1);
Tn = repmat(T,1,numNoise);

Вот шумовая версия А.

figure
plotchar(Xn(:,1))

Здесь создается и обучается вторая сеть.

net2 = feedforwardnet(25);
net2 = train(net2,Xn,Tn,nnMATLAB);
 
Computing Resources:
MATLAB on GLNXA64
 

Тестирование обеих нейронных сетей

noiseLevels = 0:.05:1;
numLevels = length(noiseLevels);
percError1 = zeros(1,numLevels);
percError2 = zeros(1,numLevels);
for i = 1:numLevels
  Xtest = min(max(repmat(X,1,numNoise)+randn(35,26*numNoise)*noiseLevels(i),0),1);
  Y1 = net1(Xtest);
  percError1(i) = sum(sum(abs(Tn-compet(Y1))))/(26*numNoise*2);
  Y2 = net2(Xtest);
  percError2(i) = sum(sum(abs(Tn-compet(Y2))))/(26*numNoise*2);
end

figure
plot(noiseLevels,percError1*100,'--',noiseLevels,percError2*100);
title('Percentage of Recognition Errors');
xlabel('Noise Level');
ylabel('Errors');
legend('Network 1','Network 2','Location','NorthWest')

Сеть 1, обученная без шума, имеет больше ошибок из-за шума, чем Сеть 2, которая была обучена с шумом.