Нейронная сеть Хемминга

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

з функцию линейного порога;

6. Переход на шаг 1, пока не исчерпаны все нейроны первого слоя.

Исходный код:

 

for (int i=0; i<M; i++) { InputRow [i]. fOutput=0;

// Подаём образ на нейроны первого слоя for (int x=0; xPixels [x] [y] ==clBlack) InputRow [i]. fOutput+=InputRow [i]. fW [x*iDestSize+y] ;

else InputRow [i]. fOutput+=-InputRow [i]. fW [x*iDestSize+y] ;

// Выход - через функцию линейного порога if (InputRow [i]. fOutput>=N/2) InputRow [i]. fOutput=N/2;

}

 

Теперь надо передать данные с выходов первого слоя на входы второго и в список результатов предыдущего прохода распознавания. Это совсем просто:

 

float fOutputs [M] ; // Копия выходов предыдущего прохода for (int i=0; i<M; i++) { SecondRow [i]. fOutput=fOutputs [i] =InputRow [i]. fOutput;

SecondRow [i]. fSum=0;

}

 

Теперь может начинать работу второй слой. Рассмотрим алгоритм его работы:

1. Обнуляется счётчик итераций;

2. Запоминаются выходы нейронов в списке результатов предыдущего прохода;

3. Перебирается сеть по нейронам;

4. i-й нейрон посылает свой выход на i-й вход каждого нейрона;

5. Каждый нейрон, принимая значения, накапливает их, предварительно умножив на коэффициент e (кроме случая, когда нейрон принимает своё же значение - тогда он должен умножить его на 1);

6. Переход на шаг 4, пока не будут обработаны все нейроны;

7. Накопленные суммы каждый нейрон посылает на свой выход;

8. Переход на шаг 2, пока выходы нейронов на текущей итерации не совпадут с выходами на предыдущей или пока счётчик числа итераций не превысит некоторое значение.

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

 

int iCount=0;

do { for (int i=0; i<M; i++) // Знаения предыдущей утерации { fOutputs [i] =SecondRow [i]. fOutput;

SecondRow [i]. fSum=0;

} for (int i=0; i<M; i++) // Один шаг работы второго слоя for (int j=0; j<M; j++) // С его выходов на его же входы if (i==j) SecondRow [j]. fSum+=SecondRow [i]. fOutput;

else SecondRow [j]. fSum+=SecondRow [i]. fOutput*e;

for (int i=0; i<M; i++) // Функция - линейная SecondRow [i]. fOutput=SecondRow [i]. fSum;

} while (! bEqual (fOutputs) && ++iCount<25); // Пока выходы не стабилизируются

 

Последний шаг - выбор из нейронов второго слоя с наибольшим значением на выходе. Его номер и есть номер распознанного образа:

 

float fMax=-N;

int iIndex;

for (int i=0; ifMax) { fMax=SecondRow [i]. fOutput;

iIndex=i;

}

 

2. Описание программы.

Руководство пользователя.

 

 

При загрузке формы происходит обучение сети. Данная реализация рассчитана на работу с девятью образами. Для изменения числа образов необходимо изменить значение константы const int M=9 на необходимое число образов и перекомпиллировать программу. Образы в процессе загрузки читаются из директории запускаемой программы из файлов *. bmp. В данной случае там находятся 9 файлов с образами, имя файла должно складываться из номера образа (начало отсчета - 0) и расширения ". bmp". Если программа не найдет нужного кол-ва файлов - возникает необрабатываемая исключительная ситуация.

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

После выбора изображения становиться доступной кнопка "Локализовать", которая запускает процедуру локализации, определяет границы собственно изображения в пустой области фона и центрует изображение с разрешением 40*40. Локализованное изображение появляется в поле объекта типа TImage.

После этого становиться доступной кнопка "Исказить". Прежде, чем ее нажать, пользователь может изменить значение в поле процент зашумления (0-100%). Кнопка запускает процедуру искажения изображения, в результате которой формируется два искаженных изображения. Первый методом анизотропной апертурной фильтрации (искажаются границы символа, как это бывает при искажениях печати символа на бумаге). Второй способ искажает изображение добавлением N-процентного белого шума, т.е. случайно инвертирует N-процентов общего кол-ва точек, составляющих вектор изображения. При 100% происходит полная инверсия символа. И хотя пользователь в таком случае может различить символ - данная реализация программы не умеет этого делать, т.к считает, что символ изображается черными точками. В форме отображаются оба результата.

На этом этапе становятся доступными две кнопки "распознать" - для первого и второго искаженного образа.

После активизации обеих кнопок "Распознать" можно выбрать либо новый образ, либо поэкспериментировать с текущим, варьируя процент зашумления.

Исследование проводилось таким образом: последовательно увеличивая зашумленность образов (буква И), они подавались на вход сети Хемминга. Результаты работы приведены в таблице 1:

 

Тестируемый образПроцент зашумления образаВид искаженного образаРезультат распознавания10%

Таким образом, НС Хемминга прекрасно справляется с задачей распознавания образов для экспериментов с искажением на 0 - 45%. В это диапазоне все эталоны распознаются без ошибок.

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

При 80-90% зашумления образ начинает инвертироваться и при зашумлении 100% мы видим полностью инвертированное изображение исходного. Хотя, человек может распознать с легкостью инвертированный символ, программа не умеет этого делать, т.к считает, что с