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

 
Urain:

и главное исходничек как эта архитектура создавалась.

Два входа - это значения какого-то индикатора или кто-то внешний будет подавать данные ? 

 
yu-sha:

Два входа - это значения какого-то индикатора или кто-то внешний будет подавать данные ? 

внешние данные, как и выход, можешь отобразить можешь исключить, по желанию.

ЗЫ это рисунок из задачи XOR, класcическая MLP

 
Urain:

Щас стрельнула шальная мыслишка:

может быть попросить у MQ  API постановки задач кластеру???

чтоб раздавать задание минуя тестер, прямо из MQL5. Задача конечно сложная, нужно много проверок устанавливать, но решаемая.

ЗЫ как думаете братья, не шибко высоко замахнулся? кластер конечно священная корова, но пахать то нужно.


Было бы очень здорово! Но, тут, наверное, вопрос станет, как будут оплачиваться агенты в этом случае?

 

 

Может так ?

Иначе непонятен смысл нейронов 1, 2 и 8

 
yu-sha:

 

Может так ?

Иначе непонятен смысл нейронов 1 и 2 

 

Ну можно так, не суть важно.
 

Первый xml-файл: сеть до препроцессинга - UrainTaskPre.xml

Когда однотипных нейронов много легко ошибиться - здесь задаем шаблон, а препроцессор должен его развернуть в готовый файл сети 

<ROOT>

    <NET>

                <LAYER CLASS="EXTERN" NAME="INPUT">
                        <NEURON NAME="NEURON:%ID%.INPUT" VALUE="0.0">
                                <REPEAT FOR="%ID%" FROM="1" TO="2"/>
                        </NEURON>
                </LAYER>

                <LAYER CLASS="TANH" NAME="HID:0">
                        <NEURON NAME="NEURON:%ID%.HID:0" BIAS="0.0">
                                <REPEAT FOR="%ID%" FROM="1" TO="2"/>
                                <LINK TO="expr:.+\.INPUT$" WEIGHT="0.0"/>
                        </NEURON>
                </LAYER>

                <LAYER CLASS="TANH" NAME="OUT">
                        <NEURON NAME="OUT" BIAS="0.0">
                                <LINK TO="expr:.+\.HID:0$" WEIGHT="0.0"/>
                        </NEURON>
                </LAYER>

    </NET>

</ROOT>

 

Дальше препроцессор обрабатывает подстановки <REPEAT .../>,  <INCLUDE .../>, "expr:..." и получаем сеть

UrainTaskPost.xml

<ROOT>
    <NET>
        <LAYER CLASS="EXTERN" NAME="INPUT">
            <NEURON NAME="NEURON:1.INPUT" VALUE="0.0" />
            <NEURON NAME="NEURON:2.INPUT" VALUE="0.0" />
        </LAYER>
        <LAYER CLASS="TANH" NAME="HID:0">
            <NEURON NAME="NEURON:1.HID:0" BIAS="0.0">
                <LINK TO="NEURON:1.INPUT" WEIGHT="0.0" />
                <LINK TO="NEURON:2.INPUT" WEIGHT="0.0" />
            </NEURON>
            <NEURON NAME="NEURON:2.HID:0" BIAS="0.0">
                <LINK TO="NEURON:1.INPUT" WEIGHT="0.0" />
                <LINK TO="NEURON:2.INPUT" WEIGHT="0.0" />
            </NEURON>
        </LAYER>
        <LAYER CLASS="TANH" NAME="OUT">
            <NEURON NAME="OUT" BIAS="0.0">
                <LINK TO="NEURON:1.HID:0" WEIGHT="0.0" />
                <LINK TO="NEURON:2.HID:0" WEIGHT="0.0" />
            </NEURON>
        </LAYER>
    </NET>
</ROOT>

 

Ниже скрипт, который открывает XML-файл, парсит его в дерево XML, из него создает нейросеть, инициализирует входы и вот он Run()

//+------------------------------------------------------------------+
//|                                                  UrainScript.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Cuda\Base.mqh>

CXmlDocument xmlDoc;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
    string err;
    
    // Создаем дерево XML
    if (xmlDoc.CreateFromFile("UrainTaskPost.xml",err))
    {
      Print ("Root:",xmlDoc.FDocumentElement.GetName());
      CXmlElement * xmlNet = xmlDoc.FDocumentElement.GetChild(0);

      // Печатаем вложенные уровни
      for (int j=0; j<xmlNet.GetChildCount(); j++)
      {
        CXmlElement * xmlLayer = xmlNet.GetChild(j);
        Print ("Element #",j,", CLASS=",xmlLayer.GetAttributeValue("CLASS"),", NAME=",xmlLayer.GetAttributeValue("NAME"));
      }
      
      // Строим нейросеть из дерева XML
      CNet net;
      if (net.LoadFrom(xmlNet))
      {
        ((CNeuronService*)(net.GetNeuron("NEURON:1.INPUT"))).SetValue(0.1234f);
        ((CNeuronService*)(net.GetNeuron("NEURON:2.INPUT"))).SetValue(0.1234f);
        net.Run();
        Print ("OUT=",net.GetNeuron("OUT").GetValue());
      }
    }
   
  }
//+------------------------------------------------------------------+

Примечание:

class CNeuronService обрабатывает нейроны типа "EXTERN" - осталась небольшая нестыковка с давних времен

Проще привыкнуть, чем исправить  )))

 

Результаты работы скрипта: 


 

 

UrainTaskPost.xml необходимо положить в общую папку терминала, например, C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common\Files

Файлы из архива - в MQL5\Include 

Файлы:
 
yu-sha:

Первый xml-файл: сеть до препроцессинга - UrainTaskPre.xml

Когда однотипных нейронов много легко ошибиться - здесь задаем шаблон, а препроцессор должен его развернуть в готовый файл сети 

 

Дальше препроцессор обрабатывает подстановки <REPEAT .../> и получаем сеть

UrainTaskPost.xml

 

Ниже скрипт, который открывает XML-файл, парсит его в дерево XML, из него создает нейросеть, инициализирует входы и вот он Run()

Уже теплее, теперь объясни как интерпретировать файл.

куда чего записывать, чтоб создать связи, или ткни где указано что они заданы.

 
Urain:

Уже теплее, теперь объясни как интерпретировать файл.

куда чего записывать, чтоб создать связи, или ткни где указано что они заданы.

1) Каждый нейрон должен иметь уникальное имя, например NEURON:1.HID:0 

Из имени можно понять, что это 1ый нейрон слоя HID:0

2) Линки (связи) используют для адресации имена нейронов + веса

3) каждый класс нейрона может (и должен) переопределить virtual bool Init (CXmlElement *aXmlElement, CNet *aNet) и загружаться из XML-элемента в соответствии со своими требованиями к параметрам

P.S.

XML-файлы лучше редактировать Блокнотом, чем Excel'ом )) 

 
yu-sha:

1) Каждый нейрон должен иметь уникальное имя, например NEURON:1.HID:0 

Из имени можно понять, что это 1ый нейрон слоя HID:0

2) Линки (связи) используют для адресации имена нейронов + веса

3) каждый класс нейрона может (и должен) переопределить virtual bool Init (CXmlElement *aXmlElement, CNet *aNet) и загружаться из XML-элемента в соответствии со своими требованиями к параметрам

P.S.

XML-файлы лучше редактировать Блокнотом, чем Excel'ом )) 

Да я его родимого и Экселем и Вордом и блокнотом, ну не очевидно, парево будет, это пока два нейрона а будет 200-2000 да каждый по 100-200 связей.

Если уже и изголятся как нить, то чтоб графически удобно было или отобразить, а ещё лучше графически редактировать.

если уже чёто делать то чтоб было удобнее чем вот это: столбцы откуда получаем, строки куда раздаём

[количество слоёв] 3
[тип 0 слоя]input[количество нейронов 0 слой]2
[тип 1 слоя]mlp  [количество нейронов 1 слой]2
[тип 2 слоя]mlp  [количество нейронов 2 слой]1
   0 1 2 3 4
 -----------
0| 0 0 1 1 0
1| 0 0 1 1 0
2| 0 0 0 0 1
3| 0 0 0 0 1
4| 0 0 0 0 0
 
Urain:

Да я его родимого и Экселем и Вордом и блокнотом, ну не очевидно, парево будет, это пока два нейрона а будет 200-2000 да каждый по 100-200 связей.

Если уже и изголятся как нить, то чтоб графически удобно было или отобразить, а ещё лучше графически редактировать.

 PreProcessor именно для этого

Хоть 2 нейрона, хоть 100, - размер файла один и тот же 

Ну, а кому графически, так никто не мешает - пишем GUI и пользуем 

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