O "New Neural" é um projecto de motor de rede neural Open Source para a plataforma MetaTrader 5. - página 72

 
Urain:

e, mais importante, o código fonte de como esta arquitetura foi criada.

As duas entradas são os valores de algum indicador ou alguém externo irá alimentar os dados?

 
yu-sha:

As duas entradas são os valores de um indicador ou alguém externo vai fornecer os dados?

Dados externos, como saída, podem ser exibidos ou excluídos conforme desejado.

ZS este é um desenho de uma tarefa XOR, clássico MLP

 
Urain:

Agora ocorreu-me um pensamento vadio:

Talvez para pedir ao MQ API para definir tarefas para cluster?

para distribuir a tarefa diretamente da MQL5, contornando o testador. A tarefa é certamente complexa, há muitas verificações a serem definidas, mas é controlável.

Achas, irmãos, que não é muito alto varrer? aglomeram-se certamente vacas sagradas, mas temos de trabalhar muito.


Seria muito fixe! Mas a questão seria como os agentes seriam remunerados neste caso?

 

Que tal isto?

Caso contrário, o significado dos neurónios 1, 2 e 8 não é claro.

 
yu-sha:

Que tal isto?

Caso contrário, o significado dos neurónios 1 e 2 não é claro.

Bem, você poderia fazer isso, não é essa a questão.
 

Primeiro arquivo xml-: rede antes do pré-processamento -UrainTaskPre.xml

Quando há muitos neurónios do mesmo tipo é fácil cometer um erro - aqui especificamos um modelo e o pré-processador deve expandi-lo para um ficheiro de rede pronto a usar.

<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>

Além disso, o pré-processador trata de substituições <REPEAT .../>, <INCLUDE .../>, "expr:..." e obtemos a rede

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>

Abaixo está um script que abre um arquivo XML, analisa-o em uma árvore XML, cria uma rede neural a partir dele, inicializa as entradas e aqui ele é 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.1234 f);
        ((CNeuronService*)(net.GetNeuron("NEURON:2.INPUT"))).SetValue(0.1234 f);
        net.Run();
        Print ("OUT=",net.GetNeuron("OUT").GetValue());
      }
    }
   
  }
//+------------------------------------------------------------------+

Nota:

classe CNeuronService lida com neurônios do tipo "EXTERN" - deixou um pouco de inconsistência dos velhos tempos

É mais fácil habituar-se a ele do que consertá-lo ))))

Resultados do roteiro:


UrainTaskPost.xml deve ser colocado em uma pasta terminal comum, por exemplo, C:\Documents and Settings\Todos os usuários\Dados de aplicação\MetaQuotes\FilesCommon

Arquivos do arquivo para MQL5\Incluir

Arquivos anexados:
 
yu-sha:

Primeiro arquivo xml-: rede antes do pré-processamento -UrainTaskPre.xml

Quando há muitos neurónios do mesmo tipo é fácil cometer um erro - aqui especificamos um modelo e o pré-processador deve desembrulhá-lo num ficheiro de rede pronto a usar.

Além disso, o pré-processador processa as substituições <REPEAT .../> e nós obtemos a rede

UrainTaskPost.xml

Abaixo está um script que abre um arquivo XML, analisa-o na árvore XML, cria uma rede neural a partir dele, inicializa as entradas e é Run()

A aquecer, agora explique como interpretar o ficheiro.

Onde escrever o que criar links, ou onde diz que eles estão colocados.

 
Urain:

Está ficando mais quente, agora explique como interpretar o arquivo.

Onde escrever o que fazer as conexões, ou onde diz que elas estão estabelecidas.

1) Cada neurônio deve ter um nome único, por exemplo NEURON:1.HID:0

O nome indica que é o 1º neurônio da camada HID:0

2) Os links usam os nomes dos neurônios + pesos para endereçamento

3) Cada classe de neurônio pode (e deve) substituir o bool virtual Init (CXmlElement *aXmlElement, CNet *aNet) e carregar a partir do elemento XML de acordo com seus requisitos de parâmetro

P.S.

Os ficheiros XML são melhores para editar com o Bloco de Notas do que com o Excel ))

 
yu-sha:

1) Cada neurônio deve ter um nome único, por exemplo NEURON:1.HID:0

O nome implica que é o 1º neurónio da camada HID:0

2) os links usam os nomes dos neurônios + pesos para endereçamento

3) Cada classe de neurônio pode (e deve) substituir o bool virtual Init (CXmlElement *aXmlElement, CNet *aNet) e carregar a partir do elemento XML de acordo com seus requisitos de parâmetro

P.S.

Os ficheiros XML são melhores para editar com o Bloco de Notas do que com o Excel ))

Sim, posso editá-lo tanto com Excel como com Word e Notepad, mas não é óbvio - são dois neurónios, e serão 200-2000, e cada um terá 100-200 links.

Se eu tiver que mexer nele, quero que seja graficamente útil ou que mostre, e melhor ainda, que seja editável graficamente.

se você vai fazer algo, deve ser mais conveniente do que isto: colunas de onde você o recebe, linhas onde você o distribui para

[количество слоёв] 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:

Já usei tanto o Excel como o Word e o bloco de notas, mas não é óbvio, é uma confusão, são dois neurónios e serão 200-2000 e cada um terá 100-200 ligações.

Se eu tiver que mexer nele, quero que seja fácil de usar ou exibir graficamente, ou, melhor ainda, de editar graficamente.

É para isso que serve o Pré-Processador.

Quer você tenha 2 neurônios ou 100, o tamanho do arquivo é o mesmo.

E se você quiser editar graficamente, ninguém o incomoda, basta escrever uma GUI e usar

Razão: