Странно сетка работает.
В процессе обучения, ошибка сначала уменьшается, затем начинает увеличиваться.
Это так задумано? Или я, что не так делаю?
Так должно быть? (На выходе 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
возможно я делаю что то не так или код не правильно работает
хочу обучить НС таблице умножения и посчитать 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
По факту, вы обучаете сеть 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?
Сравнивая результаты обучения таблице умножения ваша сеть заметно проигрывает. На ALGLIB сеть 2,5,1 за 100 эпох обучения (https://www.mql5.com/ru/forum/8265/page2) дает лучшие ответы, чем ваша с 1000000 эпохами. Скорость вычисления 1000000 эпох тоже не радует.
Видимо метод обучения не очень эффективный. Но все равно - спасибо за работу, в малом коде легче разобраться, чем в ALGLIB. Но потом все же надо туда переходить.
Сравнивая результаты обучения таблице умножения ваша сеть заметно проигрывает. На ALGLIB сеть 2,5,1 за 100 эпох обучения (https://www.mql5.com/ru/forum/8265/page2) дает лучшие ответы, чем ваша с 1000000 эпохами. Скорость вычисления 1000000 эпох тоже не радует.
Видимо метод обучения не очень эффективный. Но все равно - спасибо за работу, в малом коде легче разобраться, чем в ALGLIB. Но потом все же надо туда переходить.
не верное сравнение, в варианте алглиба все 100 примеров показаны для обучения, потому и правильнее ответы. думаю если в алгибе урезать варианты примеров с ответами то результаты не будут лучше.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Класс нейронной сети MLP:
Автор: Yury Kulikov