Olá guys,
Primeira vez aqui \o, venho pedir ajuda com RNA em java, tenho conhecimento médio da teoria de redes neurais mas não sei como aplicar isto em Java, gostaria de um código de uma rede simples para entender como os neurônios são criados em Java entre outras funções. Quem puder me ajudar agradeço muito, é para o meu TCC \o/, obrigado dês de já.
Tem esse framework muito e tem um material bem legal :
tem esse tambem : http://neuroph.sourceforge.net/
e esse livro : https://www.packtpub.com/networking-and-servers/neural-network-programming-java
um exemplo usando o encog
import org.encog.engine.network.activation.ActivationSigmoid;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.basic.BasicMLDataSet;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.propagation.back.Backpropagation;
public class BackPropagation {
// Entrada necessaris para o XOR
public static double XOR_INPUT[][] = { {1.0,0.0}, {0.0,0.0} , {0.0,1.0}, {1.0,1.0}};
// Dados ideais necessarios para XOR
public static double XOR_IDEAL[][] = { {1.0}, {0.0},{1.0},{0.0}};
public static void main(String[] args) {
// configura a rede neural
//cria a rede neural
BasicNetwork netWork = new BasicNetwork();
netWork.addLayer(new BasicLayer(null, true,2));
netWork.addLayer(new BasicLayer(new ActivationSigmoid(), true, 3));
netWork.addLayer(new BasicLayer(new ActivationSigmoid(),true,1));
netWork.getStructure().finalizeStructure();
netWork.reset();
// treinamento
// criar dados de treinamento
MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT,XOR_IDEAL);
//treinar rede neural
final Backpropagation train = new Backpropagation(netWork, trainingSet,0.7,0.3);
//inicando
int epoch = 1;
// interação
do {
train.iteration();
System.out.println("Epoch - #" + epoch + "Erro : " + train.getError());
epoch++;
} while(train.getError() > 0.01);
// teste
System.out.println("Neural Net result");
for(MLDataPair pair : trainingSet) {
final MLData output = netWork.compute(pair.getInput());
System.out.println(pair.getInput().getData(0) + ","
+ pair.getInput().getData(1) + ", actual ="
+ output.getData(0) + ", ideal="
+pair.getIdeal().getData(0));
}
System.out.println("\n\n");
trainingSet.forEach(MLDataPair -> {
final MLData output = netWork.compute(MLDataPair.getInput());
System.out.println(MLDataPair.getInput().getData(0) + ","
+ MLDataPair.getInput().getData(1) + ", actual ="
+ output.getData(0) + ", ideal="
+MLDataPair.getIdeal().getData(0));
});
}
}
{ },s.
1 curtida
O mais importante é entender como funciona uma rede neural. Conhecimento “médio”, “básico” ou “avançado” é muito relativo, e já que você precisa de um guia pra fazer a sua em Java, tem esse exemplo aqui que cria uma rede neural em Python com 9 linhas de código.
Uma vez entendido, você pode transportar para Java.
Resumindo, basicamente você precisa configurar layers, onde cada layer terá seus neurônios com seus respectivos pesos iniciais. O processo de treinamento consiste em calcular o output de cada layer até chegar na última, aplicando funções de ativação. Com o resultado, iterar e repetir o processo de modo que da próxima vez o resultado estará mais próximo do desejado.
Se precisar também pode dar uma olhada nessa RNA que criei em Elixir. A linguagem é funcional, mas a lógica serve pra qualquer tipo de linguagem. A minha ainda considero básica e um work in progress, mas cobre o aspecto de forward/back propagation, ativação com sigmoid e operações básicas com matrizes.