Библиотеки: Класс нейронной сети MLP

 

Класс нейронной сети MLP:

Класс CNetMLP реализует многослойный персептрон(MLP).

Автор: Yury Kulikov

 

Странно сетка работает.

В процессе обучения, ошибка сначала уменьшается, затем начинает увеличиваться.

Это так задумано? Или я, что не так делаю? 

 

Результат тестового примера: 

2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=0, 0 Выход=0 Проверка=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=0, 1 Выход=0 Проверка=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=1, 0 Выход=0 Проверка=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=1, 1 Выход=0 Проверка=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.375  Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Пример для диапазона входных данных от 0 до 1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=-1, -1 Выход=0 Проверка=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=-1, 1 Выход=0 Проверка=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=1, -1 Выход=0 Проверка=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Вход=1, 1 Выход=0 Проверка=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) MSE=0.9375  Epoch=1001
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Пример для диапазона входных данных от -1 до 1

Так должно быть? (На выходе 0,0,0,0 и громадная ошибка)

 

возможно я делаю что то не так или код не правильно работает

хочу обучить НС таблице умножения и посчитать 2х3, делаю так:

#property copyright "Yurich"
//+------------------------------------------------------------------+
#include <class_NetMLP.mqh>

void OnStart(){
double vector[2];   // Входной вектор
int snn[]={2,2,1};    // Структура сети
double out[1];      // Массив для ответов сети

double inpdata[];// Массив входных обучающих данных
double outdata[];// Массив выходных обучающих данных

   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.0e-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);
}
//+------------------------------------------------------------------+

в логе имею:

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.215934174267907e-005  Epoch=1001
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=3.215934174267907e-005 , out =23.81042803092551
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=2.506540371444645e-006 , out =22.233366741152
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.524148111498897e-006 , out =20.42036901380543
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.519171222235065e-006 , out =18.89110154263913
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=1.047462369320528e-006 , out =16.63410153653344
2012.10.07 22:46:43     TestMLPs (EURUSD,D1)    MSE=9.477321159986828e-007 , out =14.24605748950336
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=6.585902193183645e-007 , out =11.66913117122246
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.237858920539329e-007 , out =8.906822741170629
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.540333890146069e-007 , out =6.033412338430783
2012.10.07 22:46:42     TestMLPs (EURUSD,D1)    MSE=2.26424262746638e-007 , out =2.942888766617119

 

 

 
IgorM:

возможно я делаю что то не так или код не правильно работает

хочу обучить НС таблице умножения и посчитать 2х3, делаю так:

По факту, вы обучаете сеть 10 примерами. Если вы хотите передать в сеть все 100 примеров, то нужно обучение вынести из цикла подготовки данных. Также важно определить число нейронов и критерий остановки обучения - 1000 эпох слишком мало.

#include <class_NetMLP.mqh>
void OnStart()
{
   double vector[2];   // Входной вектор
   int snn[]={2,2,1};  // Структура сети
   double out[1];      // Массив для ответов сети
   double inpdata[];   // Массив входных обучающих данных
   double outdata[];   // Массив выходных обучающих данных
   // создание сети
   CNetMLP *net;
   int epoch=1000000;
   int AFT=0;
   net=new CNetMLP(ArraySize(snn),snn,2,AFT);
   // подготовка данных для обучения
   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;
      }
   // обучение сети
   net.Learn(100,inpdata,outdata,epoch,1.0e-8);
   Print("MSE=",net.mse,"  Epoch=",net.epoch);
   // проверка сети
   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));
   }
   // удаление сети
   delete net;
}
2012.10.08 13:46:59     test_nn (EURUSD,M15)    MSE=4.22005256254196e-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
 
Yurich:

По факту, вы обучаете сеть 10 примерами. Если вы хотите передать в сеть все 100 примеров, то нужно обучение вынести из цикла подготовки данных. Также важно определить число нейронов и критерий остановки обучения - 1000 эпох слишком мало.

спасибо, разобрался, еще поэкспериментирую с Вашим кодом

единственное пожелание:

CNetMLP *net=new CNetMLP(количество слоев, массив структуры сети, размер входного вектора, тип активационной функции: 0 - сигмоид, 1 - гиперболический тангенс).

сделать так: CNetMLP *net=new CNetMLP(массив структуры сети, тип активационной функции: 0 - сигмоид, 1 - гиперболический тангенс). 

т.е. Ваш код будет сам вычислять параметры " количество слоев" и " размер входного вектора " из  массива структуры сети , имхо это добавит наглядности и читаемости кода

 

Hallo Yuri,

zunächst einmal vielen Dank für dieses Stück Code teilt die Gemeinschaft.

Ich habe Ihren Code ein Fachberater zu bauen Diagrammwerte vorherzusagen, aber es scheint, dass es ein Fehler in der class_netmlp.mqh ist.

sobald ich versuchte, 3 zu verwenden oder mehrere Eingangswerte ist der Ausgang nicht ganz richtig mehr scheint .... können Sie mir dieses Problem Festsetzung helfen?

Файлы:
 
please see the pictures
Файлы:
example1.jpg  67 kb
example2.jpg  39 kb
 

Сравнивая результаты обучения таблице умножения ваша сеть заметно проигрывает. На ALGLIB сеть 2,5,1 за 100 эпох обучения (https://www.mql5.com/ru/forum/8265/page2) дает лучшие ответы, чем ваша с 1000000 эпохами. Скорость вычисления 1000000 эпох тоже не радует.

Видимо метод обучения не очень эффективный. Но все равно - спасибо за работу, в малом коде легче разобраться, чем в ALGLIB. Но потом все же надо туда переходить.

Библиотеки: ALGLIB - библиотека численного анализа
Библиотеки: ALGLIB - библиотека численного анализа
  • 2012.10.12
  • www.mql5.com
Форум алго-трейдеров MQL5
 
elibrarius:

Сравнивая результаты обучения таблице умножения ваша сеть заметно проигрывает. На ALGLIB сеть 2,5,1 за 100 эпох обучения (https://www.mql5.com/ru/forum/8265/page2) дает лучшие ответы, чем ваша с 1000000 эпохами. Скорость вычисления 1000000 эпох тоже не радует.

Видимо метод обучения не очень эффективный. Но все равно - спасибо за работу, в малом коде легче разобраться, чем в ALGLIB. Но потом все же надо туда переходить.

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

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