Нейронная сеть Хопфилда

Автор работы: Пользователь скрыл имя, 12 Октября 2011 в 22:10, лабораторная работа

Описание

Цель работы: разработать модель нейронной сети Хопфилда, обучить данную сеть образам. Сеть должна уметь из произвольного неидеального сигнала, поданного на ее вход, выделить ("вспомнить" по частичной информации) соответствующий образец (если такой есть) или "дать заключение" о том, что входные данные не соответствуют ни одному из образцов.

Работа состоит из  1 файл

Otchetlab1.doc

— 262.00 Кб (Скачать документ)

Федеральное агентство по образованию

ГОУ ВПО

«Владимирский государственный университет»

Кафедра ФиПМ 
 
 
 
 
 
 
 
 
 
 
 

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

«Нейронная сеть Хопфилда» 
 
 
 
 
 
 
 
 
 
 
 
 

                                                                                             Выполнила:

                                                      Ст. гр. ПМИ-105

                                                      Щетникова В.Ю.

                                                      Проверил:

                                                      Горлов В.Н. 
 
 
 
 
 
 
 

Владимир 2009

Цель  работы: разработать модель нейронной сети Хопфилда, обучить данную сеть образам. Сеть должна уметь из произвольного неидеального сигнала, поданного на ее вход, выделить ("вспомнить" по частичной информации) соответствующий образец (если такой есть) или "дать заключение" о том, что входные данные не соответствуют ни одному из образцов. 

Задание: разработать программу, моделирующую нейронную сеть Хопфилда. Обучить сеть различным искаженным исходным образам, для чего разработать оконный интерфейс. Входы нейрона непосредственно связаны с точками поля для ввода изображения. Число входных образов и размер изображения пользователь задает произвольно. Формат изображения .bmp. 

     Оконный интерфейс состоит из формы «Нейронная сеть Хопфилда» с тестированием и обучением сети.

     Данная форма содержит следующие кнопки: «Обучить», «Открыть», «Тестировать», «Очистить», «Сохранить», «Выход»; поле «Размер»; области для входного и выходного образов; строка «Кол-во итераций», строка состояния.

    

Теоретическая Часть

    Джон Хопфилд впервые представил свою ассоциативную сеть в 1982 г. в Национальной Академии Наук. В честь Хопфилда и нового подхода к моделированию, эта сетевая парадигма упоминается как сеть Хопфилда.

     Задача, решаемая данной сетью в качестве ассоциативной памяти, как правило, формулируется следующим образом. Известен некоторый набор двоичных сигналов (изображений, звуковых оцифровок, прочих данных, описывающих некие объекты или характеристики процессов), которые считаются образцовыми. Сеть должна уметь из произвольного неидеального сигнала, поданного на ее вход, выделить ("вспомнить" по частичной информации) соответствующий образец.

     Сеть Хопфилда состоит из единственного слоя нейронов, число которых является одновременно числом входов и выходов сети. Каждый нейрон связан синапсами со всеми остальными нейронами, а также имеет один входной синапс, через который осуществляется ввод сигнала. Выходные сигналы, как обычно, образуются на аксонах:

     В общем случае, любой сигнал может быть описан вектором X = { xi: i=0...n-1}, n – число нейронов в сети и размерность входных и выходных векторов. Каждый элемент xi равен либо +1, либо -1. Обозначим вектор, описывающий k-ый образец, через Xk, а его компоненты, соответственно, – xik, k=0...m-1, m – число образцов. Когда сеть распознáет (или "вспомнит") какой-либо образец на основе предъявленных ей данных, ее выходы будут содержать именно его, то есть Y = Xk, где Y – вектор выходных значений сети: Y = { yi: i=0,...n-1}. В противном случае, выходной вектор не совпадет ни с одним образцовым.

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

     На стадии инициализации сети весовые коэффициенты синапсов устанавливаются следующим образом:

 (1)

     Здесь i и j – индексы, соответственно, предсинаптического и постсинаптического нейронов; xik, xjk – i-ый и j-ый элементы вектора k-ого образца. 

     Алгоритм функционирования сети (p – номер итерации):

      1. На входы сети подается неизвестный сигнал. Фактически его ввод осуществляется непосредственной установкой значений аксонов:

yi(0) = xi , i = 0...n-1,  (2)

поэтому обозначение  на схеме сети входных синапсов в  явном виде носит чисто условный характер. Ноль в скобке справа от yi означает нулевую итерацию в цикле работы сети.

      2. Рассчитывается новое состояние нейронов

, j=0...n-1 (3)

и новые значения аксонов

 (4)

где f – активационная функция (пороговая), рис.):

Рис.2 Активационные функции 

      3. Проверка, изменились ли выходные значения аксонов за последнюю итерацию. Если да – переход к пункту 2, иначе (если выходы застабилизировались) – конец. При этом выходной вектор представляет собой образец, наилучшим образом сочетающийся с входными данными. 

     Обычно ответом является такое устойчивое состояние, которое совпадает с одним из запомненных при обучении векторов, однако при некоторых условиях (в частности, при слишком большом количестве запомненных образов) результатом работы может стать так называемый ложный аттрактор ("химера"), состоящий из нескольких частей разных запомненных образов. 

     Если сеть Хопфилда используется как память, адресуемая по смыслу, она имеет два главных ограничения:

     1) Иногда сеть не может провести распознавание и выдает на выходе несуществующий образ. Это связано с проблемой ограниченности возможностей сети. Для сети Хопфилда число запоминаемых образов m не должно превышать величины, примерно равной 0.15•n. Если сохраняется слишком много параметров, сеть может сходиься к новому несуществующему образу, отличному от всех запрограммированных образов, или не сходится вообще.

     2) Вторым ограничением является то, что слой Хопфилда может стать нестабильным, если обучающие примеры являются слишком похожими. Образец образа считается нестабильным, если он применяется за нулевое время и сеть сходится к некоторому другому образу из обучающего множества.  

Ход Работы: 

     Вначале необходимо обучить нейронную сеть. Для этого пользователь должен задать число входных образов и выбрать размер изображения, в результате обучения появится файл с весами w.txt.

  I. Форма «Нейронная сеть Хопфилда»: предполагает загрузку образа с обучением, тестированием сети и сохранением выходного образа в файл.  

     На форме отображены следующие элементы:

- Поля отображаемых входного и выходного образов

- Поле «Размер» для изображения (возможно задать произвольный размер)

- Поле «Кол-во  образов» (задание произвольного  числа образов)

- Меню «О программе»

- Кнопки: «Обучить», «Открыть», «Тестировать», «Очистить» (очистка поля изображения),

 «Сохранить» (сохранение выходного изображения в файл), «ВЫХОД».

     Меню «О программе»:

II. Процесс обучения нейронной сети Хопфилда: вначале обучения необходимо задать количество входных образов и размер изображения, нажать кнопку «Обучить». При этом будут выданы вспомогательные сообщения: «Запоминание образов. Нажмите Ок» и «Запись в файл весов. Нажмите Ок»:

                   
 

     В строке состояния на форме также отображаются действия, производимые программой.

     При окончании обучения будет выдано сообщение «Обучение завершено!»:

      Также все номера и значения весов сохраняются в файле w.txt.

II. Процесс тестирования нейронной сети Хопфилда: вначале нажимаем кнопку «Открыть» и выбираем нужный входной образ, допустим:

     Далее  нажимаем кнопку «Тестировать», будет выдано сообщение «Начата загрузка файла весов. Нажмите Ок»:

     Сообщение  «Начата обработка изображения.  Нажмите Ок»:

     При  окончании тестирования будет выдано сообщение «Тестирование завершено!»:

 

     Результат тестирования изображения:

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

     Пример  «химеры» на выходе: подадим в  качестве входного образа изображение, содержащее слишком мало информации, увидим, что сеть не смогла распознать данный образ и выдала на выходе результат слияния всех входных образов:

 

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

namespace Hopfild

{

    public partial class Hopf_net : Form

    {

        sbyte[,] w;

        int test;   //флаг загрузки весов из файла:если 1 - веса уже были загружены, 0 - еще не загружены

        int N;   //размер изображения

        int Nisp;   //размер изображения, вводимый пользователем 

        public Hopf_net()

        {

            InitializeComponent();

        } 

        public int[] Loadbmpd(String fname)   //загрузка изображения для обучения

        {

            Bitmap image = new Bitmap(fname);

            int[] x = new int[N];

           int k = 0;   //курсор в одномерном массиве весов для загружаемого изображения

            for (int i = 0; i < (int)Math.Sqrt(N); i++)

            {

                if (k == N) break;

                for (int j = 0; j < (int)Math.Sqrt(N); j++)

                    if (image.GetPixel(i, j).ToArgb() == Color.Black.ToArgb())

                        x[k++] = 1;

                    else

                        x[k++] = -1;

            }

            return x;

        } 

        public int[] Loadbmpd_see(String fname)  //загрузка изображения для тестирования

        {

            Bitmap image = new Bitmap(fname);

            int[] x = new int[N];

            int k = 0;

            for (int i = 0; i < (int)Math.Sqrt(N); i++)

            {

                if (k == N) break;

                for (int j = 0; j < (int)Math.Sqrt(N); j++)

                {

                    if (i < (int)Math.Sqrt(Nisp) && j < (int)Math.Sqrt(Nisp))     //проверяем, не вышло ли изображение за

                                                                                                                пределы размеров

                    {

                       if (image.GetPixel(i, j).ToArgb() == Color.Black.ToArgb())

                            x[k++] = 1;

                        else

                            x[k++] = -1;

                    }

                    else

                    {

                            x[k++] = -1;      //если вышли за пределы, то заполняем фон белым цветом

Информация о работе Нейронная сеть Хопфилда