Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МИИ лабы 2007.doc
Скачиваний:
26
Добавлен:
12.11.2019
Размер:
629.76 Кб
Скачать

Распознавание символов на многослойной нейронной сети прямого распространения.

Цель работы: Изучение возможности применения МНСПР для распознавания символов и формирования примеров для обучения.

Работа выполняется на программе MATLAB.

Время выполнения работы — 4 учебных часа

Методика выполнения работы.

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

Для распознавания образов удобнее всего использовать структуру НС представленную на рис. 3.1. Число входов НС определяется числом признаков N (например, в самом простом случае N определяет число пикселей изображения), а число выходов числом классов M (числом различных образов). При обучении каждому входному образу ставится в соответствии выходной вектор , который состоит из всех нулей и одной единицы, находящейся в позиции, соответствующей номеру данного класса.

Рис. 3.1. Структура входов и выходов НС для решения задачи распознавания образов

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

. (3.1)

Наличие искаженных образов (зашумленных или затененных) может приводить к потере надежности распознавания или вовсе к неправильному распознаванию. Поэтому при обучении НС желательно использовать искаженные образы. Задачник (обучающая выборка) расширяется за счет дополнительных примеров, соответствующих возможным или случайно искаженным образам.

Определим постановку задачи и последовательность ее решения на следующем примере. Требуется распознать 10 букв английского алфавита состоящие из 35 бит информации (7х5 пикселей).

Понятно, что число входов МНСПР должно соответствовать числу бит информации в каждой букве (35), а число выходов определяется числом классов (т.е. числом распознаваемых букв 10). При подаче на вход МНСПР первой буквы на первом выходе должна появиться единица, а на остальных ноль. При подаче на вход МНСПР второй буквы на втором выходе должна появиться единица, а на остальных ноль и т.д. Тогда для обучения МНСПР необходимо создать входной массив inp размерность 35х10 для всех 10 букв и единичную матрицу эталонных ответов out размерность которой будет 10х10.

Для формирования входной матрицы символов воспользуемся встроенной функцией MATLAB prprob, которая возвращает матрицу 35х26, содержащую все буквы английского алфавита закодированные в виде столбцов из 35 элементов {-1, +1}.

Код MATLAB для создания входного и выходного массива

% КОД 1. // Задаем эталонные входные и выходные матрицы

[P,T] = prprob; % стандартная библиотека английских букв

% P-Матрица английского алфавита 35x26. T- единичная матрица 26x26 .

Nvar = 1; % номер варианта

Np = 10; % число букв

inp = P(:,Nvar:Nvar+Np-1); % вход. выбираем Np букв соотв. варианту

out = eye(Np); % эталонный выход

Можно посмотреть на рисунке вид буквы, используя функцию рисования матрицы (предварительно преобразовав данные из вектора 35х1 в матрицу 5х7 с помощью функции reshape(inp(:,1),5,7) и транспонировав ее). Для примера возьмем первую букву "А" из эталонного массива.

imagesc(reshape(inp(:,1),5,7)'), grid

colormap(1-gray)

На рис. 3.2. приведена буква "A" и ее зашумленный вариант (добавлено 5 случайных точек). Функция colormap(1-gray) позволяет отображать белым цветом 0 и черным 1, что принято и более наглядно.

Рис. 3.2. Отображение буквы А

Теперь создадим нейронную сеть

% КОД 2. // Создание НС

net = newff(minmax(inp), [Np Np],{'logsig','logsig'},'trainrp');

Определим параметры обучения и обучим МНСПР

% КОД 3. // Обучение НС

net.trainParam.epochs = 500; % число итераций обучения

net.trainParam.goal = 1e-4; % требуемая точность обучения

net=train(net,inp,out); % обучение

Для проверки обучения МНСПР можно посмотреть результаты ее работы для эталонных образов.

% КОД 4. // Тестируем НС на эталонных образах

out_nn = sim(net, inp); % тестируем НС

figure(1), imagesc(out_nn),colormap(1-gray),grid

set(gca,'XTick', 1:Np);

set(gca,'XTickLabel',char(65+Nvar-1:65+Nvar-1+Np)')

title(['without noise '])

Матрица выходов при подаче всех 10 букв совпадает с эталонной (единичнойматрицей), т.е. сеть выдает верные ответы для всех букв (рис. 3.3 а).

Оценить работу МНСПР для зашумленных эталонных образов можно аналогично, добавив во входные данные шум. Код для добавления шума в эталонные данные приведен ниже.

NumPoint = 5; % число шумовых точек /0-35/

LevNoise = NumPoint/35 % уровень шума

noise = randerr(Np, 35,NumPoint)'; % создаем шум

inp_noise = satlin(inp + noise); % добавляем шум и ограничиваем результат

out_nn = sim(net, inp_noise); % тестируем НС

figure(1), imagesc(out_nn),colormap(1-gray),grid

set(gca,'XTick', 1:Np);

set(gca,'XTickLabel',char(65+Nvar-1:65+Nvar-1+Np)')

title(['with noise '])

Для создания шума используем функцию randerr(Np,35,NumPoint)', которая возвращает матрицу 35x10, в которой в каждой колонке все элементы равны 0 и только NumPoint единиц располагаются в случайных местах. Эту матрицу добавляем к эталонным образам и ограничиваем результат в диапазоне [0 1] с помощью функции satlin. При значительном уровне шума результаты классификации обычно получаются плохие (см. рис . 3.3. б).

Р ис. 3.3. Выход НС при подаче эталонных и зашумленных образах

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

% КОД 5. // Тестирование НС на случайно зашумленные образы

NTest = 100; % число искажений каждого образа

NumPoint = 5; % число шумовых точек /0-35/

LevNoise = NumPoint/35

ERR = zeros(NTest,Np); % матрица ошибок для всех тестов

for i = 1:NTest

noise = randerr(Np,35,NumPoint)'; % создаем матрицу шума Np x 35

inp_noise = satlin(inp + noise) ; % добавляем шум в данные

out_nn = sim(net, inp_noise); % тестируем НС

ERR(i,:) = sum(eye(Np).*compet(out_nn));

% Считаем и записываем правильные ответы для Np букв с шумом

end

Правильность ответа определяется поэлементным произведением эталонной и матрицы выхода НС, рассчитанной по принципу победитель получает всё (функция compet(out_nn)), и последующим суммирование по столбцам. Далее необходимо отобразить результаты.

% КОД 6. // Построение графика суммарной ошибки ERR

R = sum((ERR))/NTest*100 % процент правильных ответов

figure(1), bar(R)

set(gca,'XTick', 1:Np);

set(gca,'XTickLabel',char(65+Nvar-1:65+Nvar-1+Np)')

title(['with noise: ' num2str(LevNoise)])

На рис. 3.4 приведена оценка результатов распознавания на МНСПР 10 букв английского алфавита при наличии шума (добавлено на изображение 5 случайных точек) проведенная на основании 100 примеров для сети, которая обучалась только по исходным изображениям (а), и для сети, которая обучалась по зашумленным примерам (б).

Рис. 3.4. Результаты распознавания образов на НС (а – при обучении только на эталонные образы, б – при обучении на образы с шумом)

Простой визуальный анализ результатов позволяет однозначно сделать заключение, что при обучении МНСПР для распознавания символов необходимо использовать эталонные и зашумленные образы.

Задание 1. Обучить НС распознавать буквы английского алфавита (в виде матрицы 5х7) без и при наличии шума. Последовательность действий:

1. Написать программу в М-файле, состоящую из кодов 1, 2, 3, 4. Номер варианта присваивается переменной Nvar в коде 1. Запустить программу и оценить результаты обучения и тестирования МНСПР для распознавания образов без шума. Подобрать минимальное число скрытых нейронов N1.

2. Добавить в программу коды 5, 6. Запустить программу и протестировать МНСПР при различном уровне шума (NumPoint = 1,2,3,4,5). Сохранить графики. Оценить результаты тестирования МНСПР для распознавания образов с шумом.

Задание 2. Обучить НС на буквы английского алфавита (в виде матрицы 5х7) с шумом и оценить результаты их распознавания при наличии шума. Последовательность действий:

1. Написать новую программу в М-файле, состоящую из кодов 1, 7, 2, 3, 4), заменив в кодах 2 и 3 inp на inp_noise и out на out_noise. Номер варианта присваивается переменной Nvar в коде 1. Выбрать число скрытых нейронов N1 = Np. Запустить программу и оценить результаты обучения и тестирования МНСПР для распознавания образов при различном уровне шума (изменяя значение NumPoint = 1,2,3,4,5 в коде 5).

% КОД 7. // Создание примеров с шумом

NumPoint = 3; LevNoise = NumPoint/35

inp_noise = [inp];

out_noise = [out];

for i = 1:50

noise = randerr(Np,35,NumPoint)'; % создаем шум

inp_noise = [inp_noise satlin(inp + noise)]; % добавляем в данные шум

out_noise = [out_noise out]; %

end

2. Сравнить полученные вероятности распознавания букв для обученной НС на образы без и с шумом.

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

Контрольные вопросы:

1. Какие структуры НС еще возможно использовать для распознавания символов?

2. Как определяется число входов и выходов МНСПР для распознавания символов?

3. Как влияет обучение МНСПР на примеры с шумом на качество распознавания?

4. Как оценить достоверность ответа МНСПР?

Лабораторная работа № 4