Этот пример иллюстрирует, как обучить нейронную сеть выполнять простое распознавание символов.
Скрипт 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, которая была обучена с шумом.