"New Neural" è un progetto di motore di rete neurale Open Source per la piattaforma MetaTrader 5. - pagina 72

 
Urain:

e soprattutto il codice sorgente di come è stata creata questa architettura.

I due ingressi sono i valori di qualche indicatore o qualcuno esterno alimenterà i dati?

 
yu-sha:

I due ingressi sono i valori di un indicatore o qualcuno esterno fornirà i dati?

I dati esterni, come l'uscita, possono essere visualizzati o esclusi a piacere.

ZS questo è un disegno di un compito XOR, classico MLP

 
Urain:

Ora mi è venuto in mente un pensiero vagante:

Forse per chiedere all 'APIMQ di impostare i compiti per il cluster?

per distribuire il compito direttamente da MQL5, bypassando il tester. Il compito è certamente complesso, ci sono molti controlli da impostare, ma è gestibile.

Pensi fratelli, non è troppo alto spazzare? cluster certamente vacca sacra, ma dobbiamo lavorare duro.


Sarebbe molto bello! Ma la domanda sarebbe come verrebbero remunerati gli agenti in questo caso?

 

Che ne dite di questo?

Altrimenti il significato dei neuroni 1, 2 e 8 non è chiaro

 
yu-sha:

Che ne dite di questo?

Altrimenti il significato dei neuroni 1 e 2 non è chiaro

Si può fare, ma non è questo il punto.
 

Primo file xml: rete prima della pre-elaborazione -UrainTaskPre.xml

Quando ci sono molti neuroni dello stesso tipo è facile fare un errore - qui specifichiamo un modello e il preprocessore dovrebbe espanderlo in un file di rete già pronto

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

Inoltre il preprocessore gestisce le sostituzioni <REPEAT .../>, <INCLUDE .../>, "expr:..." e si ottiene la rete

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>

Di seguito è riportato uno script che apre un file XML, lo analizza in un albero XML, crea una rete neurale da esso, inizializza gli input ed ecco 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 classe CNeuronService gestisce i neuroni di tipo "EXTERN" - ha lasciato una piccola incongruenza dai vecchi tempi

È più facile abituarsi che aggiustarlo ))))

Risultati dello script:


UrainTaskPost.xml deve essere messo in una cartella comune del terminale, per esempio C:\Documents and Settings\Tutti gli utenti\Dati applicazione\MetaQuotes\Terminal\Common\Files

File dall'archivio a MQL5\Include

File:
 
yu-sha:

Primo file xml: rete prima della pre-elaborazione -UrainTaskPre.xml

Quando ci sono molti neuroni dello stesso tipo è facile fare un errore - qui specifichiamo un modello e il preprocessore dovrebbe scartavetrarlo in un file di rete pronto all'uso

Inoltre il preprocessore elabora le sostituzioni <REPEAT .../> e si ottiene la rete

UrainTaskPost.xml

Di seguito è riportato uno script che apre il file XML, lo analizza in un albero XML, crea una rete neurale da esso, inizializza gli input ed è Run()

Scaldandosi, ora si spiega come interpretare il file.

Dove scrivere cosa per creare link, o frugare dove dice che sono impostati.

 
Urain:

Si sta scaldando, ora spiega come interpretare il file.

Dove scrivere cosa per fare i collegamenti, o un suggerimento dove dice che sono impostati.

1) Ogni neurone deve avere un nome unico, per esempio NEURON:1.HID:0

Il nome indica che è il 1° neurone del livello HID:0

2) I collegamenti usano i nomi dei neuroni + i pesi per l'indirizzamento

3) Ogni classe neurone può (e deve) sovrascrivere il bool virtuale Init (CXmlElement *aXmlElement, CNet *aNet) e caricare dall'elemento XML secondo i suoi requisiti di parametro

P.S.

I file XML sono meglio da modificare con Notepad che con Excel ))

 
yu-sha:

1) Ogni neurone deve avere un nome unico, ad esempio NEURON:1.HID:0

Il nome implica che è il 1° neurone dello strato HID:0

2) i collegamenti usano i nomi dei neuroni + i pesi per l'indirizzamento

3) Ogni classe neurone può (e deve) sovrascrivere il bool virtuale Init (CXmlElement *aXmlElement, CNet *aNet) e caricare dall'elemento XML secondo i suoi requisiti di parametro

P.S.

I file XML sono meglio da modificare con Notepad che con Excel ))

Sì, posso modificarlo sia con Excel che con Word e Notepad, ma non è ovvio - sono due neuroni, e saranno 200-2000, e ognuno avrà 100-200 link.

Se devo giocherellarci, voglio che sia graficamente utile o visualizzabile, e ancora meglio, modificabile graficamente.

se hai intenzione di fare qualcosa, dovrebbe essere più conveniente di questo: colonne da dove lo prendi, righe dove lo distribuisci

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

Ho usato sia Excel che Word e notepad, ma non è ovvio, è un casino, sono due neuroni e saranno 200-2000 e ognuno avrà 100-200 connessioni.

Se devo giocarci, voglio che sia graficamente facile da usare o da visualizzare, o, ancora meglio, da modificare graficamente.

È a questo che serve il PreProcessore.

Che tu abbia 2 neuroni o 100, la dimensione del file è la stessa.

E se volete modificare graficamente, nessuno vi disturba, basta scrivere una GUI e usare