网格的工作原理很奇怪。
在学习过程中,误差先是减小,然后开始增大。
是这样设计的吗?还是我做错了什么?
应该是这样吗?(输出是 0,0,0,0,0,0,0 和一个巨大的错误)。
你好,尤里、
如何使用这个 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
也许我做错了什么,或者代码没有正确运行
我想让 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
事实上,您正在用 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?
比较乘法表训练的结果,你的网络输得很明显。在 ALGLIB 上,2,5,1 网络经过 100 个历元的训练(https://www.mql5.com/ru/forum/8265/page2) 所给出的答案比你的网络经过 1000000 个历元的训练所给出的答案要好。计算 10000000000 个历元的速度也不令人满意。
显然,学习方法不是很有效。不过还是要感谢你的工作,小代码比 ALGLIB 更容易理解。但我们还需要继续努力。
MLP Neural Network Class:
作者: Yury Kulikov