La grille fonctionne de manière étrange.
Au cours du processus d'apprentissage, l'erreur diminue d'abord, puis commence à augmenter.
Est-ce la façon dont elle est conçue ? Ou est-ce que je fais quelque chose de mal ?
Est-ce que c'est comme ça que ça devrait être ? (La sortie est 0,0,0,0,0,0 et une énorme erreur).
Bonjour Yury,
Comment puis-je créer un Expert Advisor en utilisant cette classe MLP ?
Merci de votre réponse.
Bonjour Yury,
Comment puis-je créer un Expert Advisor en utilisant cette classe MLP ?
Merci d'avance.
Peut-être que je fais quelque chose de mal ou que le code ne fonctionne pas correctement.
Je veux apprendre au NS la table de multiplication et compter 2x3, je fais ceci :
#property copyright "Yurich" //+------------------------------------------------------------------+ #include <class_NetMLP.mqh> void OnStart(){ double vector[2]; // Vecteur d'entrée int snn[]={2,2,1}; // Structure du réseau double out[1]; // Tableau pour les réponses du réseau double inpdata[];// Tableau des données d'apprentissage en entrée double outdata[];// Tableau des données d'entraînement en sortie CNetMLP *net; int epoch=1000; int AFT=0; net=new CNetMLP(ArraySize(snn),snn,2,AFT); ArrayResize(inpdata,20); ArrayResize(outdata,10); for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ inpdata[j*2] = (i+1)/10.0; inpdata[j*2+1] = (j+1)/10.0; outdata[j] = inpdata[j*2] * inpdata[j*2+1]; // Print("inpdata[",j*2,"]=",DoubleToString(inpdata[j*2])," / inpdata[",j*2+1,"]=",DoubleToString(inpdata[j*2+1])) ; } net.Learn(10,inpdata,outdata,epoch,1.0 e-8); vector[0] = 0.2; vector[1] = 0.3; net.Calculate(vector,out); Print("MSE=",net.mse," , out =",out[0]*100); } Print("MSE=",net.mse," Epoch=",net.epoch); } //+------------------------------------------------------------------+
dans le journal j'ai :
2012.10.07 22:46:43 TestMLPs (EURUSD,D1) 1824 bytes of leaked memory 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) 3 objects of type CLayerMLP left 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) 1 object of type CNetMLP left 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) 4 undeleted objects left 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=3.215934174267907 e-005 Epoch=1001 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=3.215934174267907 e-005 , out =23.81042803092551 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=2.506540371444645 e-006 , out =22.233366741152 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=1.524148111498897 e-006 , out =20.42036901380543 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=1.519171222235065 e-006 , out =18.89110154263913 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=1.047462369320528 e-006 , out =16.63410153653344 2012.10.07 22:46:43 TestMLPs (EURUSD,D1) MSE=9.477321159986828 e-007 , out =14.24605748950336 2012.10.07 22:46:42 TestMLPs (EURUSD,D1) MSE=6.585902193183645 e-007 , out =11.66913117122246 2012.10.07 22:46:42 TestMLPs (EURUSD,D1) MSE=2.237858920539329 e-007 , out =8.906822741170629 2012.10.07 22:46:42 TestMLPs (EURUSD,D1) MSE=2.540333890146069 e-007 , out =6.033412338430783 2012.10.07 22:46:42 TestMLPs (EURUSD,D1) MSE=2.26424262746638 e-007 , out =2.942888766617119
Peut-être que je fais quelque chose de mal ou que le code ne fonctionne pas correctement.
Je veux apprendre au NS la table de multiplication et compter 2x3, je fais cela :
En fait, vous entraînez le réseau avec 10 exemples. Si vous souhaitez transmettre les 100 exemples au réseau, vous devez retirer l'entraînement du cycle de préparation des données. Il est également important de déterminer le nombre de neurones et le critère d'arrêt de l'entraînement - 1000 époques est trop court.
#include <class_NetMLP.mqh> void OnStart() { double vector[2]; // Vecteur d'entrée int snn[]={2,2,1}; // Structure du réseau double out[1]; // Tableau pour les réponses du réseau double inpdata[]; // Tableau des données d'apprentissage en entrée double outdata[]; // Tableau des données d'entraînement en sortie // création d'un réseau CNetMLP *net; int epoch=1000000; int AFT=0; net=new CNetMLP(ArraySize(snn),snn,2,AFT); // préparation des données pour la formation ArrayResize(inpdata,200); ArrayResize(outdata,100); int m=0, k=0; for(int i=1; i<=10; i++) for(int j=1; j<=10; j++) { inpdata[m++]=i/10.0; inpdata[m++]=j/10.0; outdata[k++]=(i*j)/100.0; } // formation au réseau net.Learn(100,inpdata,outdata,epoch,1.0 e-8); Print("MSE=",net.mse," Epoch=",net.epoch); // vérification du réseau for(int i=1; i<=10; i++) { vector[0]=i/10.0; vector[1]=i/10.0; net.Calculate(vector,out); Print(i,"*",i,"=",DoubleToString(out[0]*100,1)); } // suppression du réseau delete net; }
2012.10.08 13:46:59 test_nn (EURUSD,M15) MSE=4.22005256254196 e-005 Epoch=1000001 2012.10.08 13:46:59 test_nn (EURUSD,M15) 1*1=1.3 2012.10.08 13:46:59 test_nn (EURUSD,M15) 2*2=3.4 2012.10.08 13:46:59 test_nn (EURUSD,M15) 3*3=7.6 2012.10.08 13:46:59 test_nn (EURUSD,M15) 4*4=14.8 2012.10.08 13:46:59 test_nn (EURUSD,M15) 5*5=25.0 2012.10.08 13:46:59 test_nn (EURUSD,M15) 6*6=37.2 2012.10.08 13:46:59 test_nn (EURUSD,M15) 7*7=50.2 2012.10.08 13:46:59 test_nn (EURUSD,M15) 8*8=64.3 2012.10.08 13:46:59 test_nn (EURUSD,M15) 9*9=82.2 2012.10.08 13:46:59 test_nn (EURUSD,M15) 10*10=96.9
En fait, vous entraînez le réseau avec 10 exemples. Si vous souhaitez transmettre les 100 exemples au réseau, vous devez retirer l'entraînement du cycle de préparation des données. Il est également important de déterminer le nombre de neurones et le critère d'arrêt de la formation - 1000 époques est trop court.
Merci, j'ai compris, je vais expérimenter votre code un peu plus.
Une seule demande :
CNetMLP *net=new CNetMLP(nombre de couches, tableau de structure du réseau, taille du vecteur d'entrée, type de fonction d'activation : 0 - sigmoïde, 1 - tangente hyperbolique).
faites-le de cette façon : CNetMLP *net=new CNetMLP(network structure array, activation function type : 0 - sigmoïde, 1 - tangente hyperbolique).
Votre code calculera les paramètres "nombre de couches" et "taille du vecteur d'entrée" à partir du tableau de structure du réseau, ce qui, à mon avis, améliorera la clarté et la lisibilité du code.
Bonjour Yuri,
Merci beaucoup pour cet article, le code est une source d'inspiration pour la communauté.
J'ai trouvé dans ce code un outil pour construire des diagrammes, mais il semble qu'il y ait un problème dans le fichier class_netmlp.mqh.
sobald ich versuchte, 3 zu verwenden oder mehrere Eingangswerte ist der Ausgang nicht ganz richtig mehr scheint .... Vous pouvez m'aider à résoudre ce problème ?
En comparant les résultats de l'apprentissage des tables de multiplication, votre réseau est nettement moins performant. Sur ALGLIB, le réseau 2,5,1 pour 100 époques d'apprentissage(https://www.mql5.com/ru/forum/8265/page2) donne de meilleures réponses que le vôtre avec 1000000 époques. La vitesse de calcul de 10000000000 epochs n'est pas très satisfaisante non plus.
Apparemment, la méthode d'apprentissage n'est pas très efficace. Mais tout de même - merci pour votre travail, il est plus facile à comprendre dans un petit code que dans ALGLIB. Mais nous devons encore progresser.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Classe de réseau neuronal MLP:
La classe CNetMLP met en œuvre un perseptron multicouche (MLP).
Author: Yury Kulikov