Здраствуйте. Вопрос наверно не совсем сюда надо ставить но все же.. Мне нужно создать нейронную сеть для прогнозирования (все равно какую). Проблема заключается в том что я никак не могу настроить ее так чтоб она давала приемлемую ошибку. Сначала я создал нейронную сеть в Matlab2007 - вот m-файл Код | net=newcf([1 12; 1 21],[20 1],{'logsig' 'purelin'}) net.trainParam.epochs=10000; net.trainParam.goal=0.0000004; net = train(net,inputdata,outputdata); Y=sim(net,inputdata); abs(Y-outputdata) x=1:1:length(outputdata); figure; plot(x,outputdata,x,Y,'o')
|
Здесь каскадная нейронная сеть прямого распространения с двумя слоями - два входа и один выход. В первом слое 20 нейронов с сигмоидной функцией активации, во втором 1 с линейной. Она дала хороший результат. Но я никак не могу создать такую же нейросеть для этих же данных на Java, а скомпилировать этот m-файл с помощью MATLAB Builder for Java я не могу потому как m-файлы этого toolbox Матлаба скомпилировать нельзя (это написано на их сайте).. Или я чего-то не понял... При использовании класов http://aydingurel.brinkster.net/neural/ моя сеть ведет себя странно - сначала погрешность уменьшается а потом ростет.. Код | package neural; import java.io.*;
public class example1 { public static void main(String args[]) {
// construct a Randomizer object using a seed Randomizer randomizer = new Randomizer(4);
// create a net using a configuration file System.out.println("Creating the net"); NeuralNet mynet = new NeuralNet("D:\\test2.nnc", randomizer);
// create a pattern set with 2 input and 1 output values. // randomly choose 80% of data for training, 10% for cross validation, 10% for testing.
PatternSet mypatterns = new PatternSet("D:\\t.csv", 2, 1, .8, .1, .1, randomizer);
// display the error rate before training System.out.println("\n\nError ratio before training: " + mynet.CrossValErrorRatio(mypatterns) );
while ( mynet.CrossValErrorRatio(mypatterns) > 0.0001 ) { mynet.BatchTrainPatterns(mypatterns.trainingpatterns, .8); System.out.println("Training the net. Error ratio: " + mynet.CrossValErrorRatio(mypatterns) ); }
// check the error using test data System.out.println("Error ratio of the test data: " + mynet.TestErrorRatio(mypatterns) );
System.out.println("Training is over"); // note that this was the easiest function to learn. if we had chosen another function // instead of y = x1 + x2, we would need much more training.
// now that the training is over, save the weights of the net. System.out.println("Saving the weights\n"); try{mynet.SaveWeights("D:\\example1.nnw");}catch(IOException e){}
// clean up the objects mypatterns = null; mynet = null; randomizer = null;
///Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/Ї\_/
// now recreate the net using previously saved data and // use the trained net to calculate some numbers. // You could use this part in a separate java class.
// recreate the net randomizer = new Randomizer(); System.out.println("Recreating the net"); mynet = new NeuralNet("D:\\example1.nnc", randomizer); mynet.LoadWeights("example1.nnw");
// and test it double[] inputs = {1, 1}; double[] outputs = mynet.Output(inputs); // Although there will be only one output. System.out.println("1 1 = " + outputs[0]);
System.out.println("1 2 = " + mynet.Output(new double[]{1,2})[0]); System.out.println("1 3= " + mynet.Output(new double[]{1,3})[0]); } }
Файл test2.nnc имеет вот такие записи #neurons;23 // for axonfamily, 't' stands for tanh; 'g' for logistic, 'l' for linear // type;ID;layer;flatness;axonfamily;momentum;learningrate // Input layer: i;0;0 i;1;0 // hidden layer n;2;1;1;g;0.5;1 n;3;1;1;g;0.5;1 n;4;1;1;g;0.5;1 n;5;1;1;g;0.5;1 n;6;1;1;g;0.5;1 n;7;1;1;g;0.5;1 n;8;1;1;g;0.5;1 n;9;1;1;g;0.5;1 n;10;1;1;g;0.5;1 n;11;1;1;g;0.5;1 n;12;1;1;g;0.5;1 n;13;1;1;g;0.5;1 n;14;1;1;g;0.5;1 n;15;1;1;g;0.5;1 n;16;1;1;g;0.5;1 n;17;1;1;g;0.5;1 n;18;1;1;g;0.5;1 n;19;1;1;g;0.5;1 n;20;1;1;g;0.5;1 n;21;1;1;g;0.5;1 // output layer n;22;2;1;l;0.5;1 // synapses #synapses;60 // type; ID; sourceunit; targetunit s;0;0;2 s;1;0;3 s;2;0;4 s;3;0;5 s;4;0;6 s;5;0;7 s;6;0;8 s;7;0;9 s;8;0;10 s;9;0;11 s;10;0;12 s;11;0;13 s;12;0;14 s;13;0;15 s;14;0;16 s;15;0;17 s;16;0;18 s;17;0;19 s;18;0;20 s;19;0;21 s;20;1;2 s;21;1;3 s;22;1;4 s;23;1;5 s;24;1;6 s;25;1;7 s;26;1;8 s;27;1;9 s;28;1;10 s;29;1;11 s;30;1;12 s;31;1;13 s;32;1;14 s;33;1;15 s;34;1;16 s;35;1;17 s;36;1;18 s;37;1;19 s;38;1;20 s;39;1;21 s;40;2;22 s;41;3;22 s;42;4;22 s;43;5;22 s;44;6;22 s;45;7;22 s;46;8;22 s;47;9;22 s;48;10;22 s;49;11;22 s;50;12;22 s;51;13;22 s;52;14;22 s;53;15;22 s;54;16;22 s;55;17;22 s;56;18;22 s;57;19;22 s;58;20;22 s;59;21;22
|
Еще я пробовал библиотеки JOONE и NeuralJ. Но первая очень долго приближается к заданой точности (я так и не дождался), а вторая доходит до ошибки которая потом уже не уменьшается. Наверное я просто не умею создавать эти сети.. Помогите, пожалуйста. Прилагаю данные на которых я обучаю сеть. Там первие два столбца это входы а третий - выход
Присоединённый файл ( Кол-во скачиваний: 4 )
t.zip 0,81 Kb
|