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

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

Определение задачи

Скрипт 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. Значения ограничены минимумами и максимумами, чтобы упасть между 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')

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