Використання методу зворотного розповсюдження помилки для навчання нейронної мережі

Принципи розробки програми, яка реалізує функціонування нейронної мережі для задачі розпізнавання (класифікації) літер заданого слова. Дослідження операції навчання мережі на прикладах для навчання. Лістинг програми, оцінка якості розпізнавання образів.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 10.01.2018
Размер файла 330,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Використання методу зворотного розповсюдження помилки для навчання нейронної мережі

Опис завдання

програма нейронний мережа

Скласти програму, яка реалізує функціонування нейронної мережі для задачі розпізнавання (класифікації) літер слова (КОСОВА). Представити операцію навчання мережі на прикладах для навчання. Протестувати програму для контрольних прикладів.

Дослідити вплив вище перелічених параметрів на швидкість навчання мережі та якість розпізнавання образів.

1. Теоретичні відомості

Задача полягає у розпізнаванні (класифікації) літери, яке представлене бітовою матрицею розміру 9х7. Вихідний вектор мережі має містити інформацію про належність числа до одного з 8 класів (літер слова). Наприклад, якщо на вхід мережі буде подано матрицю, що відповідає літері З, то у вихідному векторі значення другого біту буде дорівнювати 1. Для вирішення задачі обрати нейронну мережу з 63 вхідними нейронами, 6 нейронами прихованого шару і 10 вихідними нейронами (рис. 1). Нейрони прихованого шару поєднані з усіма вхідними нейронами, а зовнішнього шару - з усіма нейронами прихованого.

Рис. 1. Загальний вигляд нейронної мережі

Відповідність пікселів матриці нейронам вхідного шару наведена на рис. 2.

Рис. 2. Відповідність пікселів нейронам вхідного шару

Літери для навчання нейронної мережі показано на рис. 3 та рис. 3.1.

Рис. 3. Числа для навчання нейронної мережі(ідеальні)

Рис. 3.1. Числа для навчання нейронної мережі («пошкоджені»)

2. Алгоритм зворотного розповсюдження помилки для навчання нейтронної мережі

Суть алгоритму зводиться до послідовного подання на вхід мережі еталонних значень (рис. 3), визначення вихідного вектору мережі (прямий прохід), і корегування коефіцієнтів ваги для зв'язків нейронів на основі визначення різниці між еталонним значенням вихідного вектору та отриманим (зворотній прохід). Корегування відбувається на основі норми навчання та коефіцієнта інерції . Навчання мережі припиняється при досягненні збіжності між еталонним та отриманим значенням вихідного вектора для всіх еталонних прикладів.

При реалізації алгоритму норму навчання обрати на рівні 0.3, а коефіцієнт інерції 0.7. Значення кожного біту вихідного вектора визначати за формулою:

Послідовність кроків алгоритму:

1. Прочитати перший вхідний зразок(еталон) і встановити вихідний зразок, що йому відповідає; Converge = TRUE.

2. Задати значення для кожного з вхідних нейронів значення вхідного зразка.

3. Для елементів першого прихованого шару обчислити сумарний вхід та вихід ,

4. Повторити крок 3 для всіх наступних прихованих шарів та вихідного шару нейронів.

5. Якщо різниця між значенням виходу мережі і вихідним зразком не є допустимою, Converge = Converge&FALSE.

6. Для кожного вихідного елементу визначити його помилку

7. Для останнього прихованого шару визначити помилку кожного елемента

8. Повторити крок 7 для всіх інших шарів

9. Для всіх шарів перерахувати значення ваг кожного елемента ,

10. Якщо вхідний зразок був не останнім, прочитати наступний і перейти до кроку 2.

11. Якщо Converge == FALSE, перейти до кроку 1.

12. Кінець

Перелік позначень:

i, j, k - індекси;

- i-ий вхідний сигнал нейрону;

- ваговий коефіцієнт з'єднання i-го та j-го нейронів;

- сумарне вхідне значення нейрону j;

- вихідне значення нейрону j;

- функція активації;

- значення помилки для j-го нейрону;

- еталонне значення j-го нейрону зовнішнього шару;

- помилка для вагового коефіцієнта зв'язку між нейронами i та j на n кроці обчислень

- норма навчання;

- коефіцієнт інерції;

Converge - ознака припинення навчання.

3. Результати розпізнавання

Рисунок 1. Розпізнавання Літери «К» та «С»

Рисунок 2. Розпізнавання Літери «О» та «В»

Рисунок 3. Розпізнавання Літери «А»

Висновок

В результаті виконання курсової роботи закріплено знання про реалізацію нейронної мережі з зворотнім розповсюдженням помилки. Також програма навчена розпізнавати літери з яких складається слово(КОСОВА). Залежність якості розпізнавання від кількості нейронів на прихованому шарі (рис. 4), так як літери мають різну складність, отриманий результат є усередненим.

Рисунок 4. Залежність якості розпізнавання від кількості пікселів яких не вистачає

Додаток

Лістинг програми:

Клас «Main»:

private void jPanel1MouseClicked (java.awt.event. MouseEvent evt) {

long startTime = System.currentTimeMillis();

ArrayList<NumberPattern> listOfPatterns = new ArrayList<>();

for (int i = 0; i < 7; i++) {

listOfPatterns.add (new NumberPattern(i));

}

final int amountOfBitsInPattern = 63;

final int amountOfResults = 10;

int amountOfHiddenNeurons = Integer.parseInt (jTextField1.getText());

BackPropagationAlgorithm algo = new BackPropagationAlgorithm (amountOfBitsInPattern, amountOfHiddenNeurons, amountOfResults, listOfPatterns, this);

 //jTextArea1.setText (» - Йде процес навчання…»);

System.out.println («Studying process is running…»);

algo.execute();

File f = new File («numbers/1.bmp»);

PicConverter picConverter = new PicConverter(f);

byte[][] pattern = picConverter.getNumberPatternOnPic();

NumberPattern numberPattern = new NumberPattern(box);

 //algo.testAlgo(numberPattern);

 //jTable1.setValueAt (100, 1, 1);

jLabel4.setText (algo.testAlgo(numberPattern));

long timeSpent = System.currentTimeMillis() - startTime;

System.out.println («Розпізнавання було здійснене за» + timeSpent + «мілісекунд»);

 //jTextArea1.setText (jTextArea1.getText()+»\nРозпізнавання було здійснене за» + timeSpent + «мілісекунд»);

}

/**

* @param args the command line arguments

*/

public static void main (String args[]) {

/* Set the Nimbus look and feel */

 // <editor-fold defaultstate= «collapsed» desc=» Look and feel setting code (optional) «>

/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager. LookAndFeelInfo info: javax.swing.UIManager.getInstalledLookAndFeels()) {

if («Nimbus».equals (info.getName())) {

javax.swing.UIManager.setLookAndFeel (info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging. Logger.getLogger (main.class.getName()).log (java.util.logging. Level.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging. Logger.getLogger (main.class.getName()).log (java.util.logging. Level.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging. Logger.getLogger (main.class.getName()).log (java.util.logging. Level.SEVERE, null, ex);

} catch (javax.swing. UnsupportedLookAndFeelException ex) {

java.util.logging. Logger.getLogger (main.class.getName()).log (java.util.logging. Level.SEVERE, null, ex);

}

 // </editor-fold>

/* Create and display the form */

java.awt. EventQueue.invokeLater (new Runnable() {

public void run() {

new main().setVisible(true);

}

});

}

Клас «BackPropagationAlgorithm»:

package numberrecognizer;

import java.util. ArrayList;

public class BackPropagationAlgorithm {

private int amoutOfInN;

private int amountOfHN;

private int amountOfOutN;

private Neuron[] inNeurons;

private Neuron[] hNeurons;

private Neuron[] outNeurons;

private double teta = 0.001;

ArrayList<NumberPattern> listOfPatterns;

main main;

public BackPropagationAlgorithm (int amoutOfInN, int amountOfHN,

int amountOfOutN, ArrayList<NumberPattern> listOfPatterns, main main) {

this.main = main;

this.amoutOfInN = amoutOfInN;

this.amountOfHN = amountOfHN;

this.amountOfOutN = amountOfOutN;

this.listOfPatterns = listOfPatterns;

initNeurons();

}

private void initNeurons() {

Edge[] inputHiddenEdges = getEdges((amoutOfInN + 1) * amountOfHN);

Edge[] hiddenOutputEdges = getEdges((amountOfHN + 1) * amountOfOutN);

int outCounter = 0;

inNeurons = new Neuron[amoutOfInN];

for (int i = 0; i < inNeurons.length; i++) {

Edge[] outEdges = new Edge[amountOfHN];

for (int j = 0; j < outEdges.length; j++) {

outEdges[j] = inputHiddenEdges [outCounter++];

}

inNeurons[i] = new Neuron (null, outEdges, TypeOfNeurons. Input);

}

outCounter = 0;

hNeurons = new Neuron[amountOfHN];

for (int i = 0; i < hNeurons.length; i++) {

Edge[] inEdges = new Edge [amoutOfInN + 1];

int inCounter = i;

for (int j = 0; j < inEdges.length; j++) {

inEdges[j] = inputHiddenEdges[inCounter];

inCounter += amountOfHN;

}

Edge[] outEdges = new Edge[amountOfOutN];

for (int j = 0; j < outEdges.length; j++) {

outEdges[j] = hiddenOutputEdges [outCounter++];

}

hNeurons[i] = new Neuron (inEdges, outEdges, TypeOfNeurons. Hidden);

}

outNeurons = new Neuron[amountOfOutN];

for (int i = 0; i < outNeurons.length; i++) {

Edge[] inEdges = new Edge [amountOfHN + 1];

int inCounter = i;

for (int j = 0; j < inEdges.length; j++) {

inEdges[j] = hiddenOutputEdges[inCounter];

inCounter += amountOfOutN;

}

outNeurons[i] = new Neuron (inEdges, null, TypeOfNeurons. Output);

}

}

public Edge[] getEdges (int numOfNeurons) {

Edge[] edges = new Edge[numOfNeurons];

for (int i = 0; i < edges.length; i++) {

do {

edges[i] = new Edge (Math.random() - 0.5);

} while (edges[i].weigth == 0);

}

return edges;

}

public void execute() {

int counter = 0;

double globalError;

do {

counter++;

globalError = 0;

for (int p = 0; p < listOfPatterns.size(); p++) {

goThroughNet (listOfPatterns.get(p).getPatternMatrix());

byte[] desiredResults = listOfPatterns.get(p).getResultVector();

for (int i = 0; i < outNeurons.length; i++) {

outNeurons[i].setDisaredResult (desiredResults[i]);

outNeurons[i].calcError();

outNeurons[i].calcDeltaWeights();

}

double[] errors = new double [outNeurons.length];

for (int i = 0; i < outNeurons.length; i++) {

errors[i] = outNeurons[i].getError();

}

for (int i = 0; i < hNeurons.length; i++) {

hNeurons[i].recieveErrors(errors);

hNeurons[i].calcDeltaWeights();

}

for (int i = 0; i < hNeurons.length; i++) {

hNeurons[i].changeWeights();

}

for (int i = 0; i < outNeurons.length; i++) {

outNeurons[i].changeWeights();

}

}

for (int i = 0; i < listOfPatterns.size(); i++) {

double error = getMaxError (i, listOfPatterns.get(i).getResultVector());

if (error > globalError) {

globalError = error;

}

}

if (globalError == 1) {

initNeurons();

}

 // System.out.println(«»);

 // System.out.println («globalError =» + globalError);

 // System.out.println(«»);

} while (globalError > teta);

 //main.jTextArea1.setText («Кількість здійснених ітерацій =» + counter+»\n\nЙмовірність розпізнавання: \n»);

System.out.println («Num of iterations =» + counter);

}

public double getMaxError (int numOfPattern, byte[] desiredReluts) {

double[] errors = new double [desiredReluts.length];

ArrayList<Double> output = new ArrayList<>();

goThroughNet (listOfPatterns.get(numOfPattern).getPatternMatrix());

for (int i = 0; i < desiredReluts.length; i++) {

output.add (outNeurons[i].getSignal());

}

for (int i = 0; i < errors.length; i++) {

errors[i] = Math.abs (output.get(i) - desiredReluts[i]);

}

double max = errors[0];

for (int i = 0; i < errors.length; i++) {

max = errors[i] > max? errors[i]: max;

}

return max;

}

public void goThroughNet (byte[][] matrix) {

int k = 0;

for (int i = 0; i < matrix.length; i++) {

for (int j = 0; j < matrix[0].length; j++, k++) {

inNeurons[k].recieveSignals (new double[] {matrix[i] [j]});

inNeurons[k].calcActivationFunction();

}

}

double[] listOfSignals = new double [inNeurons.length];

for (int i = 0; i < inNeurons.length; i++) {

listOfSignals[i] = inNeurons[i].getSignal();

}

for (int j = 0; j < hNeurons.length; j++) {

hNeurons[j].recieveSignals(listOfSignals);

hNeurons[j].calcActivationFunction();

}

listOfSignals = new double [hNeurons.length];

for (int i = 0; i < hNeurons.length; i++) {

listOfSignals[i] = hNeurons[i].getSignal();

}

for (int i = 0; i < outNeurons.length; i++) {

outNeurons[i].recieveSignals(listOfSignals);

outNeurons[i].calcActivationFunction();

}

}

public String transf (int n) {

switch(n) {

case 0: return «А»;

case 1: return «Н»;

case 2: return «Д»;

case 3: return «Р»;

case 4: return «І»;

case 5: return «Ю»;

case 6: return «К»;

default: return»?»;

}

}

public String testAlgo (NumberPattern pattern) {

goThroughNet (pattern.getPatternMatrix());

showPattern (pattern.getPatternMatrix());

 //System.out.println («Desired result:» + pattern.getNumber());

 //main.jTextArea1.setText (main.jTextArea1.getText()+»\n\n - Результат розпізнавання:» + transf (getCurrentResult())+»\n»);

 //System.out.println («Result:» + transf (getCurrentResult()));

System.out.println(«»);

return transf (getCurrentResult());

}

String st=»\n»;

private void showPattern (byte[][] patternMatrix) {

for (int i = 0; i < patternMatrix.length; i++) {

for (int j = 0; j < patternMatrix[0].length; j++) {

if (patternMatrix[i] [j] == 0) {

 //main.jTextArea1.setText (main.jTextArea1.getText()+»»);

System.out.print(«»);

st=st+»»;

} else {

st=st+patternMatrix[i] [j] + «»;

 //main.jTextArea1.setText (main.jTextArea1.getText() + patternMatrix[i] [j] + «»);

System.out.print (patternMatrix[i] [j] + «»);

}

}

st=st+»\n»;

 //main.jTextArea1.setText (main.jTextArea1.getText() + «\n»);

System.out.println(«»);

}

 //main.jTextArea1.setText (main.jTextArea1.getText()+st);

}

private int getCurrentResult() {

int indexOfMax = 0;

double max = 0;

for (int i = 0; i < 7; i++) {

 //main.jTextArea1.setText (main.jTextArea1.getText()+transf(i)+» - «+(outNeurons[i].getSignal()*100)+ "%\n»);

System.out.println (transf(i)+» - «+(outNeurons[i].getSignal()*100)+ "%»);

if (outNeurons[i].getSignal() > max) {

max = outNeurons[i].getSignal();

indexOfMax = i;

}

}

return indexOfMax;

}

public double[] getDataTable() {

double[] tpm = new double[4];

for (int i = 0; i < 7; i++) {

tpm[i] = outNeurons[i].getSignal();

}

return tpm;

}

}

Размещено на Allbest.ru

...

Подобные документы

  • Навчання штучних нейронних мереж, особливості їх використання для вирішення практичних завдань. Рецепторна структура сприйняття інформації. Перцептрон як модель розпізнавання. Задача моделювання штучної нейронної мережі з розпаралелюванням процесів.

    дипломная работа [2,8 M], добавлен 24.07.2013

  • Специфіка застосування нейронних мереж. Огляд програмних засобів, що використовують нейронні мережі. Побудова загальної моделі згорткової нейронної мережі. Реалізація нейромережного модулю розпізнавання символів на прикладі номерних знаків автомобілів.

    дипломная работа [3,4 M], добавлен 15.03.2022

  • Розробка системи підтримки прийняття рішень для проектування комп’ютерної мережі. Матричний алгоритм пошуку найменших шляхів. Програма роботи алгоритму в MS Excel. Розробка програми навчання нейронної мережі на основі таблиць маршрутизації в пакеті Excel.

    курсовая работа [2,8 M], добавлен 12.12.2013

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

    контрольная работа [227,3 K], добавлен 21.06.2011

  • Вимоги до програмного виробу та функціональних характеристик. Опис інтерфейсу програмного виробу, процедур і функцій. Мережі зі зворотним розповсюдженням. Алгоритм навчання з вчителем (алгоритм зворотного розповсюдження багатошарових нейронних мереж).

    курсовая работа [1,1 M], добавлен 20.01.2009

  • Історія досліджень, пов’язаних з розпізнаванням образів, його практичне використання. Методи розпізнавання образів: метод перебору, глибокий аналіз характеристик образу, використання штучних нейронних мереж. Характерні риси й типи завдань розпізнавання.

    реферат [61,7 K], добавлен 23.12.2013

  • Бібліотека Pcap та її реалізація WinPcap під платформу Windows. Аспекти робот з бібліотекою WinPcap. Штучні нейронні мережі. Застосування бібліотеки Winpcap для захоплення мережевого трафіку. Реалізація нейронної мережі Кохонена для аналізу заголовків.

    дипломная работа [2,2 M], добавлен 09.06.2012

  • Алгоритм оптичного розпізнавання образів. Універсальність таких алгоритмів. Технологічність, зручність у процесі використання програми. Два класи алгоритмів розпізнавання друкованих символів: шрифтовий та безшрифтовий. технологія підготовки бази даних.

    реферат [24,5 K], добавлен 19.11.2008

  • Огляд методів розпізнавання образів. Основні ідеї інформаційно-екстремального методу розпізнавання рукописних символів. Критерій оптимізації параметрів функціонування даної системи. Інформаційне та програмне забезпечення обробки рукописних символів.

    дипломная работа [291,0 K], добавлен 14.10.2010

  • Розробка, дослідження та реалізація методів вирішення завдань аналізу, розпізнавання і оцінювання зображень як один із провідних напрямків інформатики. Класифікація та аналіз існуючих методів розпізнавання образів, переваги та недоліки їх застосування.

    статья [525,8 K], добавлен 19.09.2017

  • Аналіз технічного завдання: призначення розробки, відомості про LAN-мережі. Принципи ідентифікації вузлів комп’ютерної мережі в багатозадачних операційних системах. Проектування компонентів програми. Аналіз синтаксису Bash. Результати тестування.

    курсовая работа [645,6 K], добавлен 23.01.2012

  • Теоретичне дослідження особливостей проектування систем дистанційного навчання. Створення програмного забезпечення процедури статистичної обробки результатів тестування знань і оцінки якості тесту. Економічне обґрунтування доцільності розробки програми.

    дипломная работа [3,6 M], добавлен 22.10.2012

  • Методика розробки мережі із заданими параметрами. Розрахунок швидкості надходження елементів даних в систему, утилізації одного сервера, функції Ерланга та коефіцієнту Пуасона. Середній час обслуговування для елементів даних в черзі. Лістинг програми.

    контрольная работа [493,5 K], добавлен 21.10.2013

  • Задача на пошук найкоротшої відстані, маршруту і шляху холостого пробігу машин. Обгрунтування вибору методу та алгоритм розв'язання задачі. Опис математичної моделі задачі. Інтерфейс та лістинг программи. Заповнення таблиці суміжності для заданого графу.

    курсовая работа [315,5 K], добавлен 26.05.2015

  • Комп’ютерне моделювання системи сегментації та розпізнавання облич на зображеннях. Підвищення швидкодії моделювання за кольором шкіри та покращення якості розпізнавання при застосуванні робастних boosting-методів. Розробка алгоритмів функціонування.

    дипломная работа [1,6 M], добавлен 02.07.2014

  • Установки протоколів TCP/IP. Налаштування поштової програми MS Outlook Express. Класифікація пошукових систем та принципи їх роботи. Створення електронних документів в WWW для публікації в мережі Інтернет на мові HTML. Основи впровадження JavaScript.

    лабораторная работа [259,9 K], добавлен 06.11.2011

  • Сутність інформаційних технологій та їх основні компоненти. Роль глобальної мережі Інтернет у функціонуванні підприємства туристичної галузі, значення інформаційно-пошукових систем. Основні принципи та етапи роботи програми Microsoft Office PowerPoint.

    курсовая работа [1,7 M], добавлен 09.12.2011

  • Дослідження особливостей управління взаємодією вузлів мережі при обміні даними. Вивчення типів адрес, які використовуються у IP-мережі. Огляд алгоритмів гнучкого використання адресного простору, формування та обробки IP-адрес. Маршрутизація в ІР-мережах.

    контрольная работа [22,0 K], добавлен 25.04.2014

  • Вибір та обґрунтування компонентів мережі, клієнтської частини, комунікаційного обладнання та прикладного програмного забезпечення. Опис фізичної та логічної структури мережі. Принципова схема топології мережі та cхема логічної структури мережі.

    курсовая работа [487,4 K], добавлен 16.02.2015

  • Розробка методів вирішення завдань аналізу, розпізнавання, оцінювання зображень як одних з провідних напрямків інформатики. Описання методу пошуку співпадіння об’єкту-цілі з міткою-прицілом на заданому відеоряді. Виявлення об’єкта на цифровому зображенні.

    статья [138,7 K], добавлен 21.09.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.