Министерство образования и науки Российской Федерации Калужский филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования "Московский государственный технический университет имени Н.Э. Баумана" (КФ МГТУ им. Н.Э. Баумана) О Т Ч Е Т Домашнее задание №1 ДИСЦИПЛИНА:"Нейрокомпьютеры"ТЕМА:" Метод покоординатного спуска в BP" Выполнил: студент гр. ЭВМ-91Салтыков В.С. ____________________ Проверил:Комарцова Л.Г. ____________________ Дата сдачи (защиты) лабораторной работы: Результаты сдачи (защиты): Калуга, 2013 г. Теория Основная идея метода состояла в распространение сигналов ошибки от выходов НС к ее входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы. Метод обратного распространения ошибки (error back propagation - BP) это итеративный градиентный алгоритм обучения многослойных НС без обратных связей. При обучении ставится задача минимизации функции ошибки: где * yj - реальное значение j-того выхода НС; * dj - идеальное (желаемое) значение j-того выхода НС. Минимизация E ведется методом градиентного спуска. Подстройка весовых коэффициентов происходит следующим образом: где * ωij - весовой коэффициент синаптической связи, соединяющей i-ый и j-ый узлы НС; * h∈(0,1) - коэффициент скорости обучения; Полный алгоритм обучения НС с помощью процедуры обратного распространения ошибки строится следующим образом: 1. Инициализировать случайным образом все весовые коэф. НС. 2. Последовательно подать на вход HC все примеры из учебной выборки. Для каждого входа: 2.1. Фаза прямого распространения сигнала: Вычислить выход каждого нейрона НС. 2.2. Фаза обратного распространения сигнала: Для выходного слоя вычислить изменения весов Δω[N] . Для всех остальных слоев вычислить Δω[n] , n = (N-1),...,1. 2.3. Скорректировать все веса НС: 3. Если ошибка НС существенна, перейти на шаг 2, иначе - конец работы. Программа. В данном домашем задании необходимо распознать букву Д. В начале обручам Персептрон 5 раз., русую букву Д и нажимаю кнопку "Обучить". При этом вычисляются веса. Рисунок 1. Обучение Персептрона. Далее рисуем букву, которую хоти распознать. При этом также вычисляются веса и сравниваются с весами обучающей выборкой. Если они лежат в заданном диапазоне то буква распознается, иначе- нет. Рисунок 2. Распознавание буквы Д. Вывод: Исходный код: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Персептрон { class Perceptron { private double[,] _weightsMatrix; private int _size; private double _threshold = double.MaxValue; private bool _firstExample = true; public double[,] Weights { get { return _weightsMatrix; } } public double Threshold { get { return _threshold; } } public Perceptron(int size) { _size = size; _weightsMatrix = new double[size, size]; for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { _weightsMatrix[i, j] = 0.01; } } } public void Teach(bool[,] sample) { double val = 0; for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { if (sample[i, j]) { _weightsMatrix[i, j] += 1; val += _weightsMatrix[i, j]; } else _weightsMatrix[i, j] -= 0.2; } } if (_firstExample) _threshold = val; else _threshold = Math.Min(_threshold, val); _firstExample = false; } public void Teach(SimpleCell[,] sample) { double val = 0; for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { if (sample[i, j].Selected) { _weightsMatrix[i, j] += 1; val += _weightsMatrix[i, j]; } else _weightsMatrix[i, j] -= 0.2; } } if (_firstExample) _threshold = val; else _threshold = (_threshold + val)/2; _firstExample = false; } public void Save() { if (!Directory.Exists("Samples")) Directory.CreateDirectory("Samples"); using (var writer = new BinaryWriter( File.Create(string.Format("Samples\\Weights.nt")))) { writer.Write(_threshold); for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { writer.Write(_weightsMatrix[i, j]); } } writer.Flush(); } } public void Load() { using (var writer = new BinaryReader( File.Create(string.Format("Samples\\Weights.nt")))) { _threshold = writer.ReadDouble(); for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { _weightsMatrix[i, j] = writer.ReadDouble(); } } } } public bool Check(SimpleCell[,] sample) { double val = 0; for (int i = 0; i < _size; i++) { for (int j = 0; j < _size; j++) { if (sample[i, j].Selected) val += _weightsMatrix[i, j]; } } System.Windows.MessageBox.Show(string.Format("Набрали {0} из {1}", val, _threshold)); return val > _threshold; } } } .
1/--страниц