Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужно пополнить счет? Пополняй удобным тебе способом!
Automated-Trading
Админ
88669
Automated-Trading 2011.10.24 15:31 

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

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

Автор: Yury Kulikov

Serj
1400
Serj 2011.11.02 15:31  

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

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

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

nebula
57
nebula 2011.12.25 12:49  

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

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 и громадная ошибка)

IgorM М
4801
IgorM М 2012.10.07 20:50  

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

хочу обучить НС таблице умножения и посчитать 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

 

 

Yury Kulikov
26764
Yury Kulikov 2012.10.08 07:05  
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
IgorM М
4801
IgorM М 2012.10.08 10:03  
Yurich:

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

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

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

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

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

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

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий