Redes neurais em java?

Que eu saiba uma equipe de alunos dele portou a fan.

Eu olhei o link que postou. É FAN(Free Associative Neurons), e não a FANN(Fast Artificial Neural Network), que eu estava pensando.

http://leenissen.dk/fann/

Esta essa rede é de alta performance.Foi contruída para responder rapidamente, e é opensource.

Sim, eu sempre escrevi com uma letra só. eheheheheh
A FAN é outra rede, baseada em fuzzy.

[quote=ViniGodoy]Sim, eu sempre escrevi com uma letra só. eheheheheh
A FAN é outra rede, baseada em fuzzy.[/quote]

Eu li o artigo que postou. Material legal. Deveria existir uma área dessa, aqui no guj.

Tem um livro muito bom

Comprei ele há uns 4 anos. Sempre está atual. Esse tipo de coisa nunca fica desatualizada.

[code]import java.io.*;

public class TestPercpetron {

int matriz [] = {1, 0, 0, 1};
int matriz2 [] = {0, 0, 1, 1};
int pesos [] = {2,3};
int count = 0;
int dif;

public TestPerceptron() {
	
	
		
		int k = 0,l = 1, count = 0;

//Faz a soma ponderada dos pesos

		for (int i=0; i<2; i++){
			
			int result = matriz[k]*pesos[0]+matriz[l]*pesos[1];
			
			System.out.println("Resultado de "+k+ " por " +0+ " e de " 
					+ l + " por " + 1 + " = " + result);
			
			
			
//testa se o resultado da soma ponderada é igual ao resultado esperado
	
			if(result<1){
				
				
				
				dif =result - 1;
				pesos[0] = pesos[0]+(dif);
				pesos[1] = pesos[1]+(dif);
				  
			
			}
			else{
				System.out.println("\n");
				
				System.out.println("Resultado de "+k+ " por " +0+ " e de " 
						+ l + " por " + 1 + " está classificado corretamente!");
				
				System.out.println("\n");
				
			}
			
			/*/////////////////////////////////////////////////////////////////////////////   */
			
		//como não descobri um meio melhor, separei as entradas em duas matrizes diferentes para comparar as saídas 

			int result2 = matriz2[k]*pesos[0]+matriz[l]*pesos[1];
			
			if(result2>0){
			
				dif =result - 1;
				pesos[0] = pesos[0]-(dif);
				pesos[1] = pesos[1]-(dif);
				
			
			}else{
				
                System.out.println("\n");
				
				System.out.println("Resultado de "+k+ " por " +0+ " e de " 
						+ l + " por " + 1 + " está classificado corretamente!");
				
				System.out.println("\n");
				
			}
			
			
			
			k = k+2;
			l = l+2;
			count = count+1;
			
		
		
		
	}	
}[/code]

Pessoal, eu sou um iniciante na implementação de perceptrons. Esse é o meu primeiro e tentei implementar da melhor e mais simples forma possível. Queria ajuda para fazê-lo realmente funcionar, e saber se eu estou no caminho certo. O Perceptron precisa ser feito para as funções lógicas, OR, AND e XOR.

Mota, o perceptron sem a função de aprendizado não é nada. Precisa implementar um algoritmo como o backpropagation para ativa-lo.

http://www.lncc.br/~labinfo/tutorialRN/frm3_modeloPerceptron.htm
http://www.bicodocorvo.com.br/tecnologia/inteligencia-artificial/perceptron-multicamadas

Backpropagation

Aqui um exemplo em java. No link acima há vários exemplos em outras linguagens.

Existem n funções de aprendizado, e o backpropagation é a mais comum.

Kra, vlw pela dica.
Quer dizer que o que eu fiz não serve de nada?

[quote=mota]Kra, vlw pela dica.
Quer dizer que o que eu fiz não serve de nada?[/quote]

Você vai precisar dessa função de aproximação para que o perceptron entenda o que pode ser uma possível resposta. E idéia é que ele se excite e passa a informação para o próximo neurônio.

Livros indicados

O livro de implementações com java não é muito bom, e só deve ser levado em conta como modelo de implementação. O ideal para se entender redes neurais é abordar a teoria(segundo link) e implementá-la no mathlab.

Pessoal,

Esse site do Jeff, ele tem códigos? Tipo… Tem alguns frameworks abertos em que a gente pode setar as camadas, quantidades de neurônios, etc…

Funções para que o MLP possa usar quando for generalizar (o que é muito importante)… Eu vi que tem muitas coisas (teóricas) sobre os tópicos de redes neurais, mostrando o que é e tal…

Mas como programar em java no site do Jeff, tem?

[quote=gpmdf2]Pessoal,

Esse site do Jeff, ele tem códigos? Tipo… Tem alguns frameworks abertos em que a gente pode setar as camadas, quantidades de neurônios, etc…

Funções para que o MLP possa usar quando for generalizar (o que é muito importante)… Eu vi que tem muitas coisas (teóricas) sobre os tópicos de redes neurais, mostrando o que é e tal…

Mas como programar em java no site do Jeff, tem?[/quote]

A idéia é que você aprenda a teoria e possa por em prática em qualquer linguagem.

Ah, ta…

Eu to estudando redes neurais e tb to pesquisando alguns pontos sobre programação. Alguns pacotes disponibilizam o ambiente pra rodas redes neurais, usando camadas, nós, etc, etc… O problema que tô tendo é que eu não quero os modelos de aprendizagem mais comuns, como o backpropagation.

Entao to indo atras de algoritmos melhores… mas e bem interessante esse site, ele aborda varios temas da teoria…

[quote=gpmdf2]Ah, ta…

Eu to estudando redes neurais e tb to pesquisando alguns pontos sobre programação. Alguns pacotes disponibilizam o ambiente pra rodas redes neurais, usando camadas, nós, etc, etc… O problema que tô tendo é que eu não quero os modelos de aprendizagem mais comuns, como o backpropagation.

Entao to indo atras de algoritmos melhores… mas e bem interessante esse site, ele aborda varios temas da teoria…[/quote]
existem n algoritmos, mas cada um serve para uma determinada coisa.

claro.

o que eu quis dizer é que há alguns algoritmos (por exemplo, pra aprendizado) que são clássicos. Alguns mais novos visam o aprendizado de forma mais rápida (por exemplo).

É isso que tô procurando.

[quote=gpmdf2]claro.

o que eu quis dizer é que há alguns algoritmos (por exemplo, pra aprendizado) que são clássicos. Alguns mais novos visam o aprendizado de forma mais rápida (por exemplo).

É isso que tô procurando.[/quote]

esse livro que está na minha mão na foto é esse aqui:

Ele aborda muito bem esses algoritmos e tem exemplos de matlab. Integra fuzzy, gas e redes neurais para criação de sistemas híbridos.

[quote=gpmdf2]claro.

o que eu quis dizer é que há alguns algoritmos (por exemplo, pra aprendizado) que são clássicos. Alguns mais novos visam o aprendizado de forma mais rápida (por exemplo).

É isso que tô procurando.[/quote]

Veja a tese de Mestrado do Leandro Nunes em http://www.dca.fee.unicamp.br/~vonzuben/research/lnunes_mest.html

Cara, dei uma olhada bem, mas beeem por cima até agora.

Esse trabalho parece ser um tipo de “survey”, não é (lembrando que dei uma olhada bem superficial)? O que eu estou procurando é fazer algo novo, mesmo.

Até onde eu li, o trabalho que você indicou está muito bom mesmo! Vai me ajudar um bocado! Muito obrigado mesmo, amigo!

Você também trabalha com Redes neurais? estou usando para combater ataques a redes de computadores. Qual é seu trabalho na área? Se quiser conversar um pouco sobre o tema, meu e-mail é o computacaoUnicap@hotmail.com

Mais uma vez, obrigado pela dica! Vai ajudar bastante!

Pessoal,

to montando uma rede neural e até agora o framework que eu escolhi pra usar foi o joone.

eu montei uma rede, consigo salvar, carregar, treinar e colocar pra funcionar (posso, por exemplo, depois de treinar, criar um array com varias entradas, usar um FOR para mostrar cada uma dessas entrada pra rede e assim ela me responder com a classificação).

eu usei a base de dados XOR (“ou” exclusivo) e o que a rede me retorna pra cada entrada é um numero. alguem ja usou o joone com esse exemplo? existerm alguns tutoriais que usam essa base, justamente para a pessoa aprender a usar o framwork. O que significam esses numeros? Como interpretar?? um exemplo da saida : 0.0468468468464645…

é sempre um numero fracionario com a parte fracionaria beeem grande… eu preciso fazer um threshold pra isso?
base de dados:
0; 0; 0
0; 1; 1
1; 0; 1
1; 1; 1

a saida da rede deveria ser essa mesmo ou deveria ter zeros e uns? (pois nessa arquivo, as duas primeiras colunas sao para treinamento, isto é, a base de verdade e a ultima coluna é para prendizado, funciona para aprendizado supervisionado).

Olá gpmdf2

Lembrando que RNA do tipo MLP não são lineares (ao menos que você coloque uma função degrau na saída) e resultados como este é “bem” normal de acontecer. Neste caso, deve-se aplicar um arredondamento do valor da saída, para obter os valores 0 ou 1, conforme as entradas do XOR.

Em relação ao valor 0.0468468468464645… obtido com o JOONE, demonstra que o algoritmo de treinamento adotado por ele não é dos melhores, codifique você mesmo métodos de segunda ordem (newton) adaptado. Para você ter uma ideia, com o algoritmo de LM, meu treinamento do XOR se obtem valores muito próximo de zero (0,00000000151…)

Legal, Mauro

Tô começando a escrever minha rede agora e o resultado que apresentei na verdade foi só um teste, algo bem básico mesmo.

Aproveitando op que vc disse… Você já usou o Joone? Qual a classe que eu devo escrever pra implementar um novo método de aprendizado? Você tem algum exemplo? Estou ainda pesquisando alguns outros frameworks, como o neuroph e o encog.

VocÊ indica algum deles? tem algum exemplo? O próximo passo para mim seria exatamente mudar o algoritmo de aprendizado. A função em todas as camadas que estou usando é a sigmóide (SigmoydLayer do Joone).

Como vocÊ desenvolveu essa sua rede? Que framework usou? Como escreveu o algoritmo de aprendizagem? Essas são as dúvidas que tão me deixando preocupado.

Olá gpmdf2

Só fiz alguns testes com o Joone, nada relevante. Mas parece que agora o Encog (antigo JOONE) tem o algoritmo de LM (Levenberg?Marquardt algorithm) o qual é bastante eficiente para treinamento de uma MLP.

Use a tangente hiperbólica (-1,+1).

Eu tenhos redes escritas em Java e em Matlab. O interessante de você mesmo implementar, é o conhecimento adquirido, além das otimizações específicas para cada tipo de problema. No entanto, um conhecimento de cálculo se faz necessário, principalmente se adotar métodos de segunda ordem, por isto que acabei indo para o matlab.