Нейронные сети

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Нейронные сети :: Форум nn.do.am » Нейронные сети » Рекуррентные нейронные сети‎ » Сеть Хопфилда
Сеть Хопфилда
RomanДата: Вторник, 02.12.2008, 16:45 | Сообщение # 1
0 рейтинг
Группа: Пользователи
Сообщений: 3
Репутация: 0
Сеть Хопфилда как я понимаю это простейшая сеть с ассоциативной памятью..
работа всей сети разделена на 2-а этапа это обучение и собственно само распознавание(классификацию) вот
первый этап обучения это просто навсего вычисление весовой матрицы W которая считается один раз и потом используется во втором этапе классификации.
Сам первый этап этап обучения может быть реализован 2-мя путями асинхронно или синхронно (причём обучение т.е. вычисление W[i,j] лучше производить асинхронно т.к. тогда мы не попадём в ситуацию зацикливания т.е. установление баланса) вот если честно мне это не понятно почему мы туда должны не попасть???
вычисление матрицы W происходит по правилу Хебба.
Итак
Code

public const int m = 10;//размеры изображения
         public const int n = 10;//размеры изображения
         public const int N = m * n;//число нейронов в сети
         public const int P = 10;//число обучающих выборок

         public int[,] W = new int[N + 1, N + 1];//матрица синапсов
         public int[,] testArrLImg = new int[P, N];//Тестовые изображения в линейном виде(на которых сеть обучается)
         public Matrix[] testArrImg = new Matrix[P];//тестовые изображения в виде матрицы(на которых сеть обучается)

         public int[] testLImg = new int[N];//наше входное изображение которое надо распознать в линейном виде
         public Matrix testImg = new Matrix();//наше входное изображение которое надо распознать в виде матрицы
//тогда вычисление матрицы W таково
                 for (int i = 0; i < N; i++)
                 {
                     for (int j = 0; j < N; j++)
                     {
                         if (i == j) W[i, j] = 0;
                         else
                         {
                             for (int t = 0; t < P; t++)
                             {
                    W[i, j] += testArrLImg[t, i] * testArrLImg[t, j];
                             }
                         }
                     }
                 }

вот я так понимаю как вычислять матрицу W если что не правильно сори подскажите может что не понял)) т.е. по сути матрица W это как бы матрица скорелируемости всех входных образов при помощи которой потом и будет найден ответ так?

Добавлено (30.11.2008, 01:46)
---------------------------------------------
ну ещё в данном коде матрица W заполняется асинхронно насколько я понимаю))

Добавлено (02.12.2008, 16:45)
---------------------------------------------
вроде говорили что форум не мёртвый!!!
пока это не очень заметно...((

 
md6-nnДата: Вторник, 02.12.2008, 19:25 | Сообщение # 2
5 рейтинг
Группа: Проверенные
Сообщений: 5
Репутация: 0
Прошу прощения, что так долго не отвечал - интернет не работал.

Quote

вот если честно мне это не понятно почему мы туда должны не попасть???


Одной из основных задач сети Хопфилда - задача минимизации энергии.
При асинхронной работе сети, вы последовательно рассчитываете значения весов нейронов один за одним. При синхронной для всех нейронов слоя - одновременно.
Таким образом, работая асинхронно, за каждый шаг энергия сети уменьшается, а при синхронной работе, одновременно изменив значение всех весов нейронов можно миновать минимальное значение энергии (таким образом два последних состояния будут меняться друг на друга, так и не достигнув баланса)

Насчет кода - все верно, только одна поправочка:

Code
            
             for (int t = 0; t < P; t++)
             {
                 W[i, j] += testArrLImg[t, i] * testArrLImg[t, j];
             }
             W[i, j] /= N; //Здесь нужно поделить сумму на размерность входного вектора



Существует 10 типа людей. Одни понимают двоичную систему, другие нет
 
RomanДата: Среда, 03.12.2008, 14:10 | Сообщение # 3
0 рейтинг
Группа: Пользователи
Сообщений: 3
Репутация: 0
точно теперь я осознал вроде бы про асинхронный режим работы))) спасибо smile
вот
Quote (md6-nn)
Насчет кода - все верно, только одна поправочка:
Code
Code

              for (int t = 0; t < P; t++)
              {
                  W[i, j] += testArrLImg[t, i] * testArrLImg[t, j];
              }
              W[i, j] /= N; //Здесь нужно поделить сумму на размерность входного вектора [/quote]
              

так вот вопрос в следущем почему мы должны делить на число нейроннов, да и должны ли это делать впринципе?
я понял так, что это впринципе всё равно можно делить можно и не делить в инете я встречал и так и так поэтому я решил так что на самом деле это деление никакой роли не играет ну W-это можно сказать матрица корреляции всех входных изображений тогда, при умножении этой матрицы W на константу сами корреляционные коэффициенты не изменятся ну неизменится ну будут пропорциональными вот деление можно представить как 1/N вот я так считаю

 
md6-nnДата: Среда, 03.12.2008, 22:25 | Сообщение # 4
5 рейтинг
Группа: Проверенные
Сообщений: 5
Репутация: 0
Дело в том, что когда вы получаете новое состояние некоторого нейрона, вы суммируете произведения весов на состояния остальных нейронов; так вот, если выполнять такое деление, то в результате суммирования вы получите число от -1 до 1.

Существует 10 типа людей. Одни понимают двоичную систему, другие нет

Сообщение отредактировал md6-nn - Среда, 03.12.2008, 22:25
 
RomanДата: Понедельник, 15.12.2008, 02:37 | Сообщение # 5
0 рейтинг
Группа: Пользователи
Сообщений: 3
Репутация: 0
так вот посмотрим как формируется матрица W
Code

               for (int t = 0; t < P; t++)
               {
                   W[i, j] += testArrLImg[t, i] * testArrLImg[t, j];
               }
               W[i, j] /= N; //Здесь нужно поделить сумму на размерность входного вектора  

так видим что тестовые изображения могут быть сильно скорелированными тогда значение W[i,j] будет близко к N*P далее делим на N получаем, что W[i,j] близко к P чем больше скорелированны образы тем ближе наше значение к числу обучающих выборок далее идёт этап собственно распознования т.е.
Y[i]=sgn(sum(W[i,j]*Y[j])) для всех j=1,N
тут видно что даже при не сильно скорелированных образцах значение sum(W[i,j]*Y[j]) будет отличаться от +-1

Добавлено (06.12.2008, 14:36)
---------------------------------------------
ну это вопрос в чём не правильна моя логика потому что я считаю что это как раз и правильно то!

Добавлено (15.12.2008, 02:37)
---------------------------------------------
что то ни кого нету....
вопрос ещё вот какой какие ограничения на W[i,j] т.е. в каком интервале они должны быть

 
Нейронные сети :: Форум nn.do.am » Нейронные сети » Рекуррентные нейронные сети‎ » Сеть Хопфилда
  • Страница 1 из 1
  • 1
Поиск: