"New Neural" es un proyecto de motor de red neuronal de código abierto para la plataforma MetaTrader 5. - página 72

 
Urain:

y, sobre todo, el código fuente de cómo se creó esta arquitectura.

¿Las dos entradas son los valores de algún indicador o alguien externo alimentará los datos?

 
yu-sha:

¿Las dos entradas son los valores de un indicador o alguien externo suministrará los datos?

Los datos externos, al igual que la salida, pueden mostrarse o excluirse según se desee.

ZS este es un dibujo de una tarea XOR, clásico MLP

 
Urain:

Ahora se me ha ocurrido un pensamiento perdido:

¿Tal vez para pedir a la API deMQ que establezca tareas para el clúster?

para distribuir la tarea directamente desde MQL5, evitando el probador. La tarea es ciertamente compleja, hay que hacer muchas comprobaciones, pero es manejable.

¿Crees que los hermanos, no es demasiado alto barrido? grupo ciertamente vaca sagrada, pero tenemos que trabajar duro.


¡Sería muy bueno! Pero la cuestión sería cómo se remuneraría a los agentes en este caso.

 

¿Qué te parece esto?

De lo contrario, el significado de las neuronas 1, 2 y 8 no está claro

 
yu-sha:

¿Qué te parece esto?

De lo contrario, el significado de las neuronas 1 y 2 no está claro

Bueno, puedes hacer eso, pero no es la cuestión.
 

Primer archivo xml: red antes del preprocesamiento -UrainTaskPre.xml

Cuando hay muchas neuronas del mismo tipo es fácil cometer un error - aquí especificamos una plantilla y el preprocesador debe desenvolverla en un archivo de red ya hecho

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

Además el preprocesador maneja las sustituciones <REPEAT .../>, <INCLUDE .../>, "expr:..." y obtenemos la red

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>

A continuación se muestra un script que abre un archivo XML, lo analiza en un árbol XML, crea una red neuronal a partir de él, inicializa las entradas y aquí está 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:

La clase CNeuronService maneja neuronas de tipo "EXTERN" - dejó una pequeña inconsistencia de los viejos tiempos

Es más fácil acostumbrarse que arreglarlo ))))

Resultados del guión:


UrainTaskPost.xml debe colocarse en una carpeta común del terminal, por ejemplo, C:\NDocumentos y configuraciones\NTodos los usuarios\NDatos de la aplicación\NMetaQuotes\NTerminal\NFicheros comunes

Ficheros del archivo a MQL5\Include

Archivos adjuntos:
 
yu-sha:

Primer archivo xml: red antes del preprocesamiento -UrainTaskPre.xml

Cuando hay muchas neuronas del mismo tipo es fácil cometer un error - aquí especificamos una plantilla y el preprocesador debe expandirla en un archivo de red ya hecho

Además el preprocesador procesa las sustituciones <REPEAT .../> y obtenemos la red

UrainTaskPost.xml

A continuación se muestra un script que abre un archivo XML, lo analiza en un árbol XML, crea una red neuronal a partir de él, inicializa las entradas y es Run()

Calentando motores, ahora explica cómo interpretar el archivo.

Dónde escribir lo que para crear enlaces, o hurgar donde dice que se establecen.

 
Urain:

Se está calentando, ahora explica cómo interpretar el archivo.

Dónde escribir lo que para hacer las conexiones, o pista donde dice que se establecen.

1) Cada neurona debe tener un nombre único, por ejemplo NEURON:1.HID:0

El nombre indica que es la 1ª neurona de la capa HID:0

2) Los enlaces utilizan los nombres de las neuronas + los pesos para el direccionamiento

3) Cada clase de neurona puede (y debe) anular el bool virtual Init (CXmlElement *aXmlElement, CNet *aNet) y cargar desde el elemento XML según sus requisitos de parámetros

P.D.

Los archivos XML se pueden editar mejor con el Bloc de notas que con Excel ))

 
yu-sha:

1) Cada neurona debe tener un nombre único, por ejemplo NEURON:1.HID:0

El nombre implica que es la primera neurona de la capa HID:0

2) los enlaces utilizan los nombres de las neuronas + los pesos para el direccionamiento

3) Cada clase de neurona puede (y debe) anular el bool virtual Init (CXmlElement *aXmlElement, CNet *aNet) y cargar desde el elemento XML según sus requisitos de parámetros

P.D.

Los archivos XML se pueden editar mejor con el Bloc de notas que con Excel ))

Sí, puedo editarlo tanto con Excel como con Word y el Bloc de notas, pero no es obvio: son dos neuronas, y serán 200-2000, y cada una tendrá 100-200 enlaces.

Si tengo que manipularlo, quiero que sea gráficamente útil o visualizable, y mejor aún, gráficamente editable.

si vas a hacer algo, debería ser más conveniente que esto: columnas de donde lo sacas, filas a donde lo distribuyes

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

He utilizado tanto el Excel como el Word y el bloc de notas, pero no es evidente, es un lío, son dos neuronas y serán 200-2000 y cada una tendrá 100-200 conexiones.

Si tengo que manipularlo, quiero que sea gráficamente fácil de usar o mostrar, o, mejor aún, de editar gráficamente.

Para eso está el preprocesador.

Tanto si tienes 2 neuronas como si tienes 100, el tamaño del archivo es el mismo.

Y si quieres editar gráficamente, nadie te molesta, simplemente escribe una GUI y usa