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

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

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

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

Матрица T 26x26 единичная матрица, которая сопоставляет эти 26 входных векторов с этими 26 классами.

[X,T] = prprob;

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

plotchar(X(:,1))

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

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

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

setdemorandstream(pi);

net1 = feedforwardnet(25);
view(net1)

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

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

Обучение останавливается, когда сеть, более не вероятно, изменит к лучшему наборы обучения или валидации.

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

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

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

Здесь 30 шумных копий каждой буквы Xn создаются. Значения ограничиваются min и макс. упасть между 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);

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

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, который был обучен с шумом.