поэтапные вычисления
От: nayato Россия  
Дата: 24.03.05 14:33
Оценка:
Здравствуйте. Вопрос следующий: Есть нейросеть (но это не столь важно). Нужно после вычисления значений в текущем слое проводить вычисления в следующем.

Вопрос как передать результаты вычислений для предыдущего слоя в текущий. Есть две версии:
    fLinks: array of array of Single;
    // или
    fLinks: array of array of PSingle;

Оба имеют свои недостатки: первый подход: по итогам вычисления первого слоя нужно заполнить массивы входов второго слоя полученными данными. второй подход: переадресация (схема "адрес->адрес->данные" вместо "адрес->данные"). Но у второго подхода плюс в гибкости. Вопрос собственно: сколько тормозов у заполнения массивов по сравнению с переадресацией?
Или можно еще как-то это дело передавать?..
Поможите людi добрi
... << RSDN@Home 1.1.3 stable >>
Re: поэтапные вычисления
От: LaFut  
Дата: 25.03.05 07:45
Оценка:
Здравствуйте, nayato, Вы писали:

N>Здравствуйте. Вопрос следующий: Есть нейросеть (но это не столь важно). Нужно после вычисления значений в текущем слое проводить вычисления в следующем.

Тут зависит от того как у вас организованна сама сеть.
Для меня например структура видится следующим образом. Список слоев. Для каждого слоя сети имеется список нейронов. У каждого нейрона список нейронов из предыдущего слоя выходные значения которых соединены с его входом. Тогда при вычислении на i слое нейрон сам забирает данные которые ему нужны из нейронов i-1 слоя. Зачем вообще нужны промежуточные массивы мне непонятно.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[2]: поэтапные вычисления
От: nayato Россия  
Дата: 25.03.05 18:29
Оценка:
N>>Здравствуйте. Вопрос следующий: Есть нейросеть (но это не столь важно). Нужно после вычисления значений в текущем слое проводить вычисления в следующем.
LF>Тут зависит от того как у вас организованна сама сеть.
LF>Для меня например структура видится следующим образом. Список слоев. Для каждого слоя сети имеется список нейронов. У каждого нейрона список нейронов из предыдущего слоя выходные значения которых соединены с его входом. Тогда при вычислении на i слое нейрон сам забирает данные которые ему нужны из нейронов i-1 слоя. Зачем вообще нужны промежуточные массивы мне непонятно.

Неее... нейрон-объект — нерационально!
Я вижу так: слой как основной (центральный так сказать) класс, реализующий принципы сети:
1) является элементарным классом (нет нейрону объекту! )
2) активация поведения через события от предыдущего слоя (в случае первого — от сенсорного). Таким образом реализую реорганизацию сети при изменении числа нейронов в некотором слое, распространение вычислительного процесса, pruning, BP...

Сеть при этом становится сервисным таким объектом — регулирование структуры слоев, их инициализация, модификация, интерфейс статистики, формирование ОВ, ТВ, инициация вычислений и т.п.

Кстати у меня в связи с таким подходом вопрос один, а в новый топик не охота...
При инициализации очередного слоя (при определении связей с предыдущим) нужно получить массив указателей (с этим уже определился) на выходы слоя. По выбранной архитектуре получается, что это необходимо сделать при возникновении события реорганизации, инициированного этим самым предыдущим слоем. Вроде:

TLayer.setNeuronCount(...);
begin
  ...
  if assigned(fOnReorganize) then
    fOnReorganize(???);
end;


Вместо вопросиков можно поставить внутреннее (private) поле-массив указателей на выходы либо же у TLayer организовать интерфейс для получения таких указателей (в protected) и вместо вопросиков передавать самого себя любимого.
Первый подход будет быстрее, но вопрос: будет ли его использованием нарушением принципов ООП? Второй-то подход очевидно обеспечивает целостность и "внутреннесть" своих данных, а первый не очень как-то...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.