Эффективность нейронной сети будем оценивать следующим образом. Рассмотрим
2 структуры нейронной сети: сеть 1, обученную на идеальных последовательностях,
и сеть 2, обученную на зашумленных последовательностях. Проверка функционирования производится на 100 векторах входа при различных уровнях шума.
Приведем фрагмент сценария appcr1, который выполняет эти операции:
noise_range = 0:.05:.5;
max_test = 100;
network1 = [];
network2 = [];
T = targets;
% Выполнить тест
for noiselevel = noise_range
errors1 = 0;
errors2 = 0;
for i=1:max_test
P = alphabet + randn(35,26)*noiselevel;
% Тест для сети 1
A = sim(net,P);
AA = compet(A);
errors1 = errors1 + sum(sum(abs(AA–T)))/2;
% Тест для сети 2
An = sim(netn,P);
AAn = compet(An);
errors2 = errors2 + sum(sum(abs(AAn–T)))/2;
echo off
end
% Средние значения ошибок (100 последовательностей из 26 векторов целей
network1 = [network1 errors1/26/100];
network2 = [network2 errors2/26/100];
end
Тестирование реализуется следующим образом. Шум со средним значением 0 и стандартным отклонением от 0 до 0.5 с шагом 0.05 добавляется к векторам входа. Для каждого уровня шума формируется 100 зашумленных последовательностей для каждого символа
и вычисляется выход сети. Выходной сигнал обрабатывается М-функцией compet с той целью, чтобы выбрать только один из 26 элементов вектора выхода. После этого оценивается количество ошибочных классификаций и вычисляется процент ошибки.
|
|
Соответствующий график погрешности сети от уровня входного шума показан на рис. 9.25.
plot(noise_range,network1*100,'––',noise_range,network2*100);
Рис. 9.25
Сеть 1 обучена на идеальных векторах входа, а сеть 2 – на зашумленных. Обучение сети на зашумленных векторах входа значительно снижает погрешность распознавания реальных векторов входа. Сети имеют очень малые погрешности, если среднеквадратичное значение шума находится в пределах от 0.00 до 0.05. Когда к векторам был добавлен шум со среднеквадратичным значением 0.2, в обеих сетях начали возникать заметные ошибки. При этом погрешности нейронной сети, обученной на зашумленных векторах, на 3–4 % ниже, чем для сети, обученной на идеальных входных последовательностях.
Если необходима более высокая точность распознавания, сеть может быть обучена либо в течение более длительного времени, либо с использованием большего количества нейронов в скрытом слое. Можно также увеличить размер векторов, чтобы пользоваться шаблоном с более мелкой сеткой, например 10´14 точек вместо 5´7.
Проверим работу нейронной сети для распознавания символов. Сформируем зашумленный вектор входа для символа J (рис. 9.26):
noisyJ = alphabet(:,10) + randn(35,1)*0.2;
plotchar(noisyJ); % Зашумленный символ J (рис.9.26)
Рис. 9.26
A2 = sim(net,noisyJ);
A2 = compet(A2);
answer = find(compet(A2) == 1)
answer = 10
plotchar(alphabet(:,answer)); % Распознанный символ J
Нейронная сеть выделила 10 правильных элементов и восстановила символ J
без ошибок (рис. 9.27).
|
|
Рис. 9.27
Эта задача демонстрирует, как может быть разработана простая система распознавания изображений. Заметим, что процесс обучения не состоял из единственного обращения к обучающей функции. Сеть была обучена несколько раз при различных векторах входа. Обучение сети на различных наборах зашумленных векторов позволило обучить сеть работать с изображениями, искаженными шумами, что характерно для реальной практики.