Network Results:"); for(TrainingElement element : trainingSet.trainingElements()) { network.setInput(element.getInput()); network.calculate(); Vector output = network.getOutput(); SupervisedTrainingElement ste = (SupervisedTrainingElement)element; System.out.println(element.getInput().get(0) + "," + element.getInput().get(0) + ", actual=" + output.get(0) + ",ideal=" + ste.getDesiredOutput().get(0));Implementacao usando Joone Joone e o framework mais antigo dentre os anteriores, o projeto comecou em 2001 enquanto os outros dois comecaram em 2008. A tecnica de treinamento utilizada sera o Backpropagation.public static double XOR_INPUT[][] = { { 0.0, 0.0 }, { 1.0, 0.0 },{ 0.0, 1.0 }, { 1.0, 1.0 } };public static double XOR_IDEAL[][] = { { 0.0 }, { 1.0 }, { 1.0 }, { 0.0 } };/**CRIACAO*///E preciso criar cada camada individualmente, a camada de entrada sera linearLinearLayer input = new LinearLayer();SigmoidLayer hidden = new SigmoidLayer();SigmoidLayer output = new SigmoidLayer();//Nomes para as camadasinput.setLayerName("input");hidden.setLayerName("hidden");output.setLayerName("output");//Quantidade de neuronios para cada camadainput.setRows(2);hidden.setRows(3);output.setRows(1);//E preciso criar sinapses para ligar as camadas e depois nomea-lasFullSynapse synapse_IH = new FullSynapse(); FullSynapse synapse_HO = new FullSynapse();synapse_IH.setName("IH");synapse_HO.setName("HO");//Adiciona as sinapses nas camadasinput.addOutputSynapse(synapse_IH);hidden.addInputSynapse(synapse_IH);hidden.addOutputSynapse(synapse_HO);output.addInputSynapse(synapse_HO);/**TESTES*///E preciso criar um Memory Sinapse para alimentar os arrays do XORMemoryInputSynapse inputStream = new MemoryInputSynapse();//Especifica-se o array a ser usado em cada camadainputStream.setInputArray(XOR_INPUT);inputStream.setAdvancedColumnSelector("1,2");//Adiciona o objeto a sinapseinput.addInputSynapse(inputStream);//Cria uma sinapse de treinamento para a redeTeachingSynapse trainer = new TeachingSynapse();MemoryInputSynapse samples = new MemoryInputSynapse();//Especifica a saida idealsamples.setInputArray(XOR_IDEAL);samples.setAdvancedColumnSelector("1");trainer.setDesired(samples);//Conecta a sinapse de treinamentooutput.addOutputSynapse(trainer);//Cria uma rede neural para toda a estruturathis.nnet = new NeuralNet();//Adiciona as camadas a redennet.addLayer(input, NeuralNet.INPUT_LAYER);nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);//Cria um monitor para fazer o treinamentothis.monitor = nnet.getMonitor();monitor.setTrainingPatterns(4); // Quantidade de linhas existentes na entradamonitor.setTotCicles(1000); // Ciclos de treinamentomonitor.setLearningRate(0.7);monitor.setMomentum(0.3);monitor.setLearning(true); // Configura a rede para treinamentomonitor.setSingleThreadMode(true); //Modo Single Threadmonitor.addNeuralNetListener(this);}ResultadosEm geral, Encog gasta em torno de 60 iteracoes, Neuroph algumas centenas e o Joone facilmente chega a 5000 iteracoes sem apresentar resultados. Ao fazer o teste com cada um deles, nota-se que o Joone nao e mais uma boa escolha em comparacao com os outros dois frameworks, acontece que ele possui muitos bugs e nao possui mais suporte, estas foram as principais razoes que fizeram Jeff Heaton a iniciar seu proprio projeto de framework em Java: o Encog. O Encog e o framework mais completo, possui tecnicas mais avancadas de treinamento em relacao ao Neuroph e e mais bem documentado.Fontes e Links diversos:Texto e codigo adaptados de Comparing Neural Networks in Neuroph, Encog and JOONETecnica de LevenbergMarquardt: Metodo de Levenberg-MarquardtIntroducao ao Encog: An Introduction to Encog Neural Networks for Java