Реферати

Контрольна робота: Нейронна мережа Хеммінга

Види економічного ефекту. Уведення. Основний принцип ефективності говорить, що: будь-яка система, що самоорганізується, у своїй чи діяльності розвитку, прагне досягти найкращих результатів, розташовуючи кінцевою кількістю ресурсів, чи досягти наміченої мети з мінімальними витратами ресурсів.

Удосконалювання діяльності адміністрації муніципального утворення Місто Хабаровськ. МІНІСТЕРСТВО УТВОРЕННЯ І НАУКИ РОСІЙСЬКОЇ ФЕДЕРАЦІЇ Факультет державного і муніципального керування Спеціальність 080504.65 "Державне і муніципальне керування"

Задоволеність працею і відданість організації. Реферат по дисципліні організаційне поводження на тему Задоволеність працею і відданість організації Ціль реферату - розповісти про основні види відданості організації і про задоволеність працею в організації.

Удосконалювання організації обліку розрахунків з дебіторами і кредиторами. ЗМІСТ Уведення Розділ 1. Теоретичні основи обліку розрахунків з дебіторами і кредиторами Загальні принципи організації обліку розрахункових операцій Види і форми розрахунків

Склад злочину, як юридична основа класифікації злочину. Зміст Уведення......3 1 Теоретичні аспекти складу злочину......7 1.1 Поняття злочину і складу злочину......7

Національний технічний університет України

"Київський політехнічний інститут"

Фізико-технічний факультет

Контрольна робота № 1

По дисципліні "Інтелектуальні системи"

по темі: "Нейронна мережа Хеммінга"

Київ-2008

Зміст

1. Реалізація мережі. Вхідні символи

2. Навчання мережі

3. Локалізація і масштабування зображення

4 Спотворення зображення

5. Алгоритм розпізнавання

Мета: Створити програмну реалізацію статичної нейронної мережі Хеммінга, що розпізнає символи тексту.

Опис реалізації алгоритму.

1. Реалізація мережі. Вхідні символи

Для визначення загальних параметрів НС - декілька констант:

const int iSourceSize=100; // Розмір сторони початкового зображення const int iDestSize=40; // Розмір сторони зображення для розпізнавання const int N=iDestSize*iDestSize; // Скільки входів const int M=10; // Скільки образів const float е=- (1/M) /2; // Вага синапсов другого шара

Розмір вхідного образу (bmp-файл) повинен бути 100х100 точок (параметр iSourceSize), а перед обробкою він приводиться до розміру 40x40 (параметр iDestSize). Таким чином, кількість входів мережі - 1600 (один вхід - одна точка зображення; параметр N). Кількість виходів M співпадає з кількістю цифр і дорівнює 10. Вага негативного зворотного зв'язку другого шара була прийнята рівним - 0.05.

Рис 1 Приклад початкового образу

Кожний нейрон представляється у вигляді простої структури. Шар - це просто масив нейронів. Перший шар:

struct InputNeiron // Тип - нейрон першого шара { float fW [N]; // Вагові коефіцієнти синапсов float fOutput; // Вихід };

InputNeiron InputRow [M]; // Це - перший шар

Другий шар реалізовується так:

struct Neiron // Тип - нейрон другого шара { float fOutput; // Вихід float fSum; // Зважена сума входів };

Neiron SecondRow [M]; // Це - другий шар

Тут вже немає значення зберігати значення окремої ваги, т. до вони не міняються протягом всієї роботи мережі.

2. Навчання мережі

Після процедури навчання списки вагових коефіцієнтів синапсов першого шара будуть містити образи еталонних символів.

Алгоритм навчання мережі Хеммінга, адаптований для даної задачі, виглядає так:

1. Вибирається i-й вхідний образ.

2. Зображення локалізується і приводиться до потрібного масштабу.

3. Образ поточечно подається на входи i-го нейрона. Якщо k-я точка образу чорна, то вазі k-го входу привласнюється значення 0.5, в іншому випадку - 0.5 (див. формулу 5 п.3.2.5).

4. Перехід на крок 1, поки не вичерпані всі еталонні образи.

Початковий код алгоритму навчання виглядає так:

TImage* I1=new TImage (this); // Сюди завантажується еталонний образ TImage* I2=new TImage (this); // А тут буде масштабований I2- > Width=iDestSize;

I2- > Height=iDestSize;

for (int i=0; i < M; i++) { I1- > Picture- > LoadFromFile (AnsiString (i) +". bmp");

vScale (I2, I1); // Читаємо і масштабуємо образ for (int х=0; х < iDestSize; х++) for (int у=0; у < iDestSize; у++) // Перебираємо поточечно if (I2- > Canvas- > Pixels [х] [у] ==clBlack) InputRow [i]. fW [х*iDestSize+у] =0.5;

else InputRow [i]. fW [х*iDestSize+у] =-0.5;

} deleteI1;

deleteI2;

3. Локалізація і масштабування зображення

Для успішної роботи треба з'ясувати точний розмір і місцеположення образу цифри. Після локалізації - приводимо образ до розміру 40*40 (масштабування). Ці операції виконуються як на етапі навчання мережі, так і на етапі розпізнавання. Все це проробляє функція void vScale (TImage*, TImage*).

Для еталона, в зв'язку з відсутністю перешкод, локалізацію провести дуже просто: досить послідовно переглянути всі точки образу і знайти межі цифри:

float iMinX, iMinY, iMaxX, iMaxY; // Межі локалізованої цифри iMinX=iMinY=iSourceSize+1;

iMaxX=iMaxY=-1;

for (int х=0; х < iSourceSize; х++) for (int у=0; у < iSourceSize; у++) if (Source- > Canvas- > Pixels [х] [у] ==clBlack) { if (х < iMinX) iMinX=х;

if (у < iMinY) iMinY=у; if (х > iMaxX) iMaxX=х;

if (у > iMaxY) iMaxY=у;

}

У даній реалізації використовується стандартний алгоритм зворотного масштабування без інтерполяції (Source - початковий образ, Dest - отмасштабированний):

const float fScaleX= (iMaxX-iMinX) /iDestSize; // Коефіцієнти стиснення const float fScaleY= (iMaxY-iMinY) /iDestSize;

for (int х=0; х < iDestSize; х++) for (int у=0; у < =iDestSize; у++) Dest- > Canvas- > Pixels [х] [у] = Source- > Canvas- > Pixels [х*fScaleX+iMinX] [у*fScaleY+iMinY];

4 Спотворення зображення

Щоб не розпізнавати еталонні образи - введемо спотворення. Скористаємося двома способомами спотворення:

Додавання N-процентного шуму.

for (int х=0; х < IBroke2- > Width; х++)

for (int у=0; у < IBroke2- > Height; у++)

// Додаємо білий X% - й шум

if (random (100) < iPercent) // iPercent- це відсоток шуму, кіт // користувач може указати через інтерфейс діалогового вікна

if (IBroke2- > Canvas- > Pixels [х] [у] ==clBlack)

IBroke2- > Canvas- > Pixels [х] [у] =clWhite;

else

IBroke2- > Canvas- > Pixels [х] [у] =clBlack;

5. Алгоритм розпізнавання

Загальний алгоритм розпізнавання для мережі Хеммінга складається з чотирьох частин:

1. подача розпізнаваного образу на входи мережі;

2. передача даних з першого шара на другий;

3. обробка даних другим шаром;

4. вибір розпізнаного образу.

1. Алгоритм роботи першого етапу виглядає так:

1. Вибирається черговий нейрон;

2. Обнуляється його вихід;

3. Локалізується і приводиться зображення до потрібного масштабу (див. п 3.3.3);

4. Локалізований образ поточечно подається на входи i-го нейрона. Якщо k-я точка образу чорна, то до значення виходу додається значення ваги k-го входу, в іншому випадку це значення віднімається;

5. Значення виходу пропускається через функцію лінійного порога;

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

Початковий код:

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

// Подаємо образ на нейрони першого шара for (int х=0; х < iDestSize; х++) for (int у=0; у < iDestSize; у++) if (Source- > Canvas- > Pixels [х] [у] ==clBlack) InputRow [i]. fOutput+=InputRow [i]. fW [х*iDestSize+у];

else InputRow [i]. fOutput+=-InputRow [i]. fW [х*iDestSize+у];

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

}

Тепер треба передати дані з виходів першого шара на входи другого і в список результатів попереднього проходу розпізнавання. Це зовсім просто:

floatfOutputs [M]; // Копія виходів попереднього проходу for (inti=0; i < M; i++) { SecondRow [i]. fOutput=fOutputs [i] =InputRow [i]. fOutput;

SecondRow [i]. fSum=0;

}

Тепер може починати роботу другий шар. Розглянемо алгоритм його роботи:

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

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

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

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

5. Кожний нейрон, приймаючи значення, накопичує їх, заздалегідь помноживши на коефіцієнт е (крім випадку, коли нейрон приймає своє ж значення - тоді він повинен помножити його на 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*е;

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

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

Останній крок - вибір з нейронів другого шара з найбільшим значенням на виході. Його номер і є номер розпізнаного образу:

floatfMax=-N;

int iIndex;

for (int i=0; i < M; i++) if (SecondRow [i]. fOutput > fMax) { 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%

20%

30%

35%

40%

45%

50%

60%

70%

80%

90%

Таким чином, НС Хеммінга чудово справляється із задачею розпізнавання образів для експериментів з спотворенням на 0 - 45%. У це діапазоні всі еталони розпізнаються без помилок.

При 50% зашумления образи розпізнаються нестабільно, часто виникає "переплутування" і на виході НС з'являється абсолютно інший еталон.

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

При зашумленії 80-100% НС Хеммінга переплутує символи, що подаються з найбільш схожими еталонними. Наприклад, при 100% зашумления буква "П" схожа на товсту смугу і програма розпізнає символ як "1"