Ajuda com Redes Neurais Artificiais em JAVA

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.