资料库: MLP Neural Network Class

 

MLP Neural Network Class:

CNetMLP 提供多层感知(MLP).

作者: Yury Kulikov

 

网格的工作原理很奇怪。

在学习过程中,误差先是减小,然后开始增大。

是这样设计的吗?还是我做错了什么?

 

测试结果:

2011.12.25 12:42:52 TestMLPs(GBPUSD,H1) Entry=0, 0 Exit=0 Check=0
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=0, 1 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 0 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 1 Exit=0 Check=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) Input=-1, -1 Output=0 Check=-1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=-1, 1 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, -1 Exit=0 Check=1
2011.12.25 12:42:52 TestMLPs (GBPUSD,H1) Entry=1, 1 Exit=0 Check=-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,0,0,0 和一个巨大的错误)。

 

你好,尤里、

如何使用这个 MLP 类制作 Expert Advisor?

谢谢。

 
supercoder2006:

你好,尤里、

如何使用这个 MLP 类制作 Expert Advisor?

谢谢。

有人能用这些代码制作一个简单的智能交易系统 吗?
 

也许我做错了什么,或者代码没有正确运行

我想让 NS 学习乘法表和 2x3 计数,我是这样做的:

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

在日志中,我有

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

也许我做错了什么,或者代码没有正确运行

我想让 NS 学习乘法表和 2x3 计数,我是这样做的:

事实上,您需要用 10 个示例来训练网络。如果您想将所有 100 个示例都传给网络,则需要在数据准备周期之外进行训练。此外,确定神经元数量和停止训练的标准也很重要,1000 个 epoch 太短了。

#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.0 e-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.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
 
Yurich:

事实上,您正在用 10 个示例对网络进行训练。如果想将所有 100 个示例都传给网络,就需要将训练从数据准备周期中剥离出来。此外,确定神经元的数量和停止训练的标准也很重要--1000 epoch 太短了。

谢谢,我已经明白了,我会再对您的代码进行一些实验

只有一个请求:

CNetMLP *net=new CNetMLP(层数、网络结构数组输入向量大小、激活函数类型:0 - sigmoid,1 - 双曲切线)。

这样做:CNetMLP *net=new CNetMLP(网络结构数组,激活函数类型:0 - sigmoid,1 - 双曲切线)。

也就是说,您的代码将自行从网络结构数组中计算参数 "层数 "和 "输入向量大小",我认为这将增加代码的 清晰度和可读性

 

你好,尤里、

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

我曾想用他们的代码来制作图标,但发现 class_netmlp.mqh 中有问题。

因此,如果我想使用 3 个或更多 Eingangswerte,那么启动程序并不完全符合 ....。können Sie Sie mir dieses Problem Festsetzung helfen?

附加的文件:
 
请看图片
附加的文件:
example1.jpg  67 kb
example2.jpg  39 kb
 

比较乘法表训练的结果,你的网络输得很明显。在 ALGLIB 上,2,5,1 网络经过 100 个历元的训练(https://www.mql5.com/ru/forum/8265/page2) 所给出的答案比你的网络经过 1000000 个历元的训练所给出的答案要好。计算 10000000000 个历元的速度也不令人满意。

显然,学习方法不是很有效。不过还是要感谢你的工作,小代码比 ALGLIB 更容易理解。但我们还需要继续努力。

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