"Новый нейронный" - проект Open Source движка нейронной сети для платформы MetaTrader 5. - страница 54

 
TheXpert:
Предлагаю первую на реализацию или эху или SOM заодно по ходу и интерфейсы окончательно утрясти можно будет.

давай, а тебе что ближе?

ЗЫ самое простое это вообще MLP

 
Urain:
давай, а тебе что ближе?
Ближе эха, легче SOM. Лучше наверное таки SOM, т.к. его можно сделать и с учителем, и без.
 
TheXpert:
Ближе эха, легче SOM. Лучше наверное таки SOM, т.к. его можно сделать и с учителем, и без.

Ну сом так сом. 

 1. инициализация сетки
 2. рабочий ход сетки
 3. обучение сетки

Кто чё делает?

Или может сначало иерархию классов утрясём?

 
Urain:

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

данные --> нейрон --> инкапсулированная нейросеть --> контейнер нейросеть

Можно ГА сделать аморфным. Человеческий геном не всегда состоял из 28000 генов.

Ой...

 
joo:
О, ты в онлайне. Ответь про топологию
 

Первые прикидки

class IEvolvable // интерфейс для подключения эволюционных алгоритмов
{
public:
   virtual void GetWeightsAsVector(double& weights[]) const; // получаем все изменяемые веса собранные в одном векторе для генетики
   virtual void ApplyWeightsVector(double weights[]); // применяем подобранные генетикой веса к сети
   
   virtual void FeedInput(double inData[]); // подаем вход
   virtual void PropagateSignal(); // прогоняем входной сигнал
   virtual void GetOutput(double& outData[]) const; // берем выход
};

class ISerializable // сохранение
{
public:
   virtual bool LoadFromFile(string filePath);
   virtual bool SaveToFile(string filePath) const;
};

class IBasicNet
   : public IEvolvable
   , public ISerializable
{
public:
   virtual void FeedInput(double inData[]); // вход можно брать из коллекции или отдельно. Подразумевается, что коллекция включает в себя обработку входов, поэтому отдельные входы надо преобразовывать коллекцией
   virtual void FeedInput(int index);
   virtual void PropagateSignal();
   virtual void GetOutput(double& outData[]) const;
   virtual void Init(); // инициализация. Инициализатор можно подавать в конструкторе, можно в функцию, посмотрим как будет удобно
}

class ISupervised // сеть с учителем
   : public IBasicNet
{
public:
   virtual void SetPatternCollection(PatternCollection* collection); // у сетей с учителем обязательно каждому входному образу соответствует выходной поэтому лучше их сразу организовывать по парам
   virtual void CountError(); // подсчет ошибки. сюда например будет входить ОРО для MLP
   virtual void Learn(); // изменение весов. никаких итераций внутри, чтобы можно было на каждом шаге просмотреть состояние
};

class IUnsupervised // сеть без учителя
   : public IBasicNet
{
public:
   virtual void SetInputCollection(InputCollection* collection); // у сетей без учителя только входы
   virtual void Learn();
};

class IInitializer // инициализатор
{
public:
   virtual void Init(double& value);
   virtual void Init(double& value[]);
   virtual void Init(Matrix& value);
};

 
TheXpert:
О, ты в онлайне. Ответь про топологию
Это "ой" и есть.  По моим представлениям управление топологией можно и нужно рассматривать как генетическое программирование. Тут я не очень силен - это отдельная обширная область знаний. Но, если нужно, я займусь этим вопросом в плотную. Это такой ГА, у которого длина хромосомы может меняться динамически. В моём ГА хромосома фиксированной длины. Хотя, можно и тут изловчится, введя дополнительные флаги заморозки отдельных генов, при этом можно с запасом взять длину хромосомы.
 
TheXpert:

Первые прикидки

Комментариев накидай
 
joo:
Это "ой" и есть.
Ок, пока так, метод обхода проблемы есть, подумаем когда генетику крутить будем.
 
Urain:
Это следующий шаг и прямого отношения к движку не имеет, его реализация лежит через внешний ГА создающий разные топологии, те инициализирующий объекты разных движков.

И да, наверное стоит использовать несколько ГА. Один для топологии и один для подстройки всех весов всех сетей. Тогда второй ГА просто будет замораживать часть генов в зависимости от текущей топологии.

Причина обращения: