Сеть Хопфилда
|
|
Roman | Дата: Вторник, 02.12.2008, 16:45 | Сообщение # 1 |
0 рейтинг
Группа: Пользователи
Сообщений: 3
| Сеть Хопфилда как я понимаю это простейшая сеть с ассоциативной памятью.. работа всей сети разделена на 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
| Прошу прощения, что так долго не отвечал - интернет не работал. 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
| точно теперь я осознал вроде бы про асинхронный режим работы))) спасибо вот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
| Дело в том, что когда вы получаете новое состояние некоторого нейрона, вы суммируете произведения весов на состояния остальных нейронов; так вот, если выполнять такое деление, то в результате суммирования вы получите число от -1 до 1.
Существует 10 типа людей. Одни понимают двоичную систему, другие нет
Сообщение отредактировал md6-nn - Среда, 03.12.2008, 22:25 |
|
| |
Roman | Дата: Понедельник, 15.12.2008, 02:37 | Сообщение # 5 |
0 рейтинг
Группа: Пользователи
Сообщений: 3
| так вот посмотрим как формируется матрица 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] т.е. в каком интервале они должны быть
|
|
| |