PDA

View Full Version : Reti Neurali implementate in Java


Syphilis
14-11-2006, 13:07
Salve a tutti! :confused:
son un neofita del java, lavoro (studio) con le simulazioni e vorrei sapere se qualcuno di voi ha qualche corso specifico di java per l'implementazione di reti neurali feed-foward semplici...massimo con la regola delta per l'aggiornamento dei pesi! :)

un saluto
alberto

tzr
14-11-2006, 13:13
Salve a tutti! :confused:
son un neofita del java, lavoro (studio) con le simulazioni e vorrei sapere se qualcuno di voi ha qualche corso specifico di java per l'implementazione di reti neurali feed-foward semplici...massimo con la regola delta per l'aggiornamento dei pesi! :)

un saluto
alberto
visto che i calcoli delle reti neurali sono pesantissimi, trovo che Java sia il linguaggio meno indicato...

con le NN mi sono trovato appena appena bene con il C++

Syphilis
14-11-2006, 13:17
capisco...
ma devo studiarle in java
;)

PGI-Bis
14-11-2006, 13:43
Sono totalmente ignorante in materia ma forse qui puoi iniziare a scoprire qualcosa:

http://www.jeffheaton.com/ai/

magari è tutta fuffa, non lo so.

mastoo
14-11-2006, 13:54
c'e una libreria per java per implementare reti neurali si chiama SNARLI
forse puo interessarti
http://snarli.sourceforge.net/

Syphilis
14-11-2006, 14:14
...grazie siete molto gentili...:) continuate continuate...
:sofico:

Syphilis
14-11-2006, 15:39
ho trovato un file in c++ che è perfettamente la cosa che mi serviva...ehhehe ora ho un problema di traduzione...:) dato che non conosco il c++...
... :mc:

Syphilis
14-11-2006, 16:36
:cry: aiuto

shinya
14-11-2006, 17:58
Direi che se hai bisogno di reti neurali in Java la risposta più completa credo sia Joone.

http://www.jooneworld.com/

Syphilis
15-11-2006, 00:40
uhm non mi pare...
...io ho bisogno di implementare una rete in un pulcino e non di usar il programmino che mi hai detto, comunque grazie...

Syphilis
15-11-2006, 23:48
nulla eh?

ekerazha
16-11-2006, 00:30
visto che i calcoli delle reti neurali sono pesantissimi, trovo che Java sia il linguaggio meno indicato...

con le NN mi sono trovato appena appena bene con il C++
Java non è poi così lento con la server VM (qualche spunto... http://www.kano.net/javabench/ ).

ekerazha
16-11-2006, 00:51
Java non è poi così lento con la server VM (qualche spunto... http://www.kano.net/javabench/ ).
Metto le mani avanti :oink: non sto dicendo che Java è più veloce del C++ (o meglio non lo dico più da quando è uscito quest'altro articolo http://bruscy.multicon.pl/pages/przemek/java_not_really_faster_than_cpp.html :D in attesa di altri articoli che si contraddicano nuovamente :D ), dico che tutto sommato Java non se la cava male...

Syphilis
16-11-2006, 10:46
ok ...

...

:help:

Syphilis
21-11-2006, 09:53
uhm qualcuno di voi saprebbe tradurmi questo? da c++ a java??

Syphilis
22-11-2006, 09:34
ahhaha fantastico alla fine "l'artefatto" ve l'ho dato io...

... :incazzed:

PGI-Bis
22-11-2006, 13:14
ahhaha fantastico alla fine "l'artefatto" ve l'ho dato io...

... :incazzed:

In che senso :confused: ?

Syphilis
22-11-2006, 13:38
nel senso che se vi serve una rete neurale con la regola delta (quella che cercavo io) però implementata in c++(e non in java...come la cercavo io invece)...ve la do io :) o meglio basta scaricarla qui su...l'ho messa come allegato... :mbe:

Syphilis
23-11-2006, 10:27
eddai su uno che si immola per il bene della ricerca e mi traduce sta cacchio de cosa dal c++ al java... ;)

dupa
23-11-2006, 10:59
Metto le mani avanti :oink: non sto dicendo che Java è più veloce del C++ (o meglio non lo dico più da quando è uscito quest'altro articolo http://bruscy.multicon.pl/pages/przemek/java_not_really_faster_than_cpp.html :D in attesa di altri articoli che si contraddicano nuovamente :D ), dico che tutto sommato Java non se la cava male...

bè se è per questo allora un programma scritto in ASM potrebbe esser più veloce del rispettivo C++
Il fatto che come spiega anche l'articolo nel confronto Java VS C++, se il programmatore C++ non è molto bravo, allora probabilmente le ottimizzazione "automatiche" di Java avranno la meglio rispetto a una scarsa ottimizzazione manuale fatta dal coder C++

Allo stesso modo un codice assembler può essere in assoluto il più veloce, il fatto è che solo un super-guru potrebbe scrivere un codice asm per un programma molto complesso in modo completamente ottimizzato.. altrimenti rimane solo una gran confusione e difficoltà di mantenere il codice.

Syphilis
23-11-2006, 11:02
ognuno mette in mostra il proprio cavallo ma nessuno ci sale sopra... :D

dupa
23-11-2006, 11:09
ognuno mette in mostra il proprio cavallo ma nessuno ci sale sopra... :D

Eccoti la documentazione Java:
http://java.sun.com/j2se/1.5.0/docs/index.html

buon divertimento per la conversione del programma.

Syphilis
23-11-2006, 11:23
hahaahh :p

ekerazha
23-11-2006, 11:37
bè se è per questo allora un programma scritto in ASM potrebbe esser più veloce del rispettivo C++
Il fatto che come spiega anche l'articolo nel confronto Java VS C++, se il programmatore C++ non è molto bravo, allora probabilmente le ottimizzazione "automatiche" di Java avranno la meglio rispetto a una scarsa ottimizzazione manuale fatta dal coder C++

Allo stesso modo un codice assembler può essere in assoluto il più veloce, il fatto è che solo un super-guru potrebbe scrivere un codice asm per un programma molto complesso in modo completamente ottimizzato.. altrimenti rimane solo una gran confusione e difficoltà di mantenere il codice.
Questo è più che certo... ma a "parità di ottimizzazioni" C++ sembrerebbe più veloce.

dupa
23-11-2006, 13:57
Questo è più che certo... ma a "parità di ottimizzazioni" C++ sembrerebbe più veloce.
sì certo, però l'articolo spiega anche che per "pareggiare le ottimizzazioni", in C++ devi far molto più cose a mano, mentre Java fa tutto in modo molto più automatico.

PGI-Bis
23-11-2006, 14:04
C'è qualcuno con un compilatore C++ sottomano che può controllare se il file cpp incollato da Syphilis compila?

Ho provato a fare una traslitterazione al volo ma ci sono alcuni pezzi che mi risultano non inizializzati. Sono quasi certo di aver tradotto tutto passo-passo ma, data la mia totale cecità in materia di reti neurali, potrei benissimo aver scritto il testo della vergine cuccia.

Syphilis
23-11-2006, 14:18
il testo della vergine cuccia. ahahhaha :)

dovrebbe esser alquanto giusto...io non lo capisco bene, ma dai commenti che ha messo quel ragazzo indiano che l'ha fatto sembra esserci tutto...non so...grazie mille pgi :D :vicini:

ekerazha
23-11-2006, 14:23
sì certo, però l'articolo spiega anche che per "pareggiare le ottimizzazioni", in C++ devi far molto più cose a mano, mentre Java fa tutto in modo molto più automatico.
Nessuno lo mette in dubbio..

PGI-Bis
23-11-2006, 20:02
1. Premesso che di quanto ho scritto non ho capito ma non dico una virgola, meno;

2. Appurato che "me pare d'avello fatto uguale";

3. Dimostrato che tanto più s'allena Network quanto più ci azzecca e premettendo che, non sapendo quello che ho scritto, potrebbe essere un mero caso;

4. Da ultimo evidenziato che quanto segue non è codice Java ma una mera traslitterazione da C++ a Java con quei due aggiustamenti unicamente introdotti perchè a un certo punto m'ero perso;

Tutto ciò premesso, ecco la versione java che negherò sulla tomba dei miei avi di aver mai scritto.

//File Main.java
import java.util.*;
import java.io.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
PrintStream out = System.out;
int inp = 2, hid = 2, outp = 1;
int[] layers = { inp, hid, outp };
out.println("Enter number of training iterations: ");
int iter = in.nextInt();
Network net = new Network(0.1, layers, 3);
double[] input = {1, 0};
double[] outputs;
net.randomizeWeightAndBiases();
double[][] trainingInputs = {
{0, 0},
{1, 0},
{0, 1},
{1, 1},
};
double[][] trainingOutputs = {
{0},
{1},
{1},
{0}
};
out.println("Starting train...");
for(int i = 0; i < iter; i++) {
for(int j = 0; j < 4; j++) {
net.train(trainingInputs[j], trainingOutputs[j]);
}
}
out.println("End of training.");
out.println("Start test...");
for(int j = 0; j < 4; j++) {
out.println("Case number: " + (j+1));
net.setInputs(trainingInputs[j]);
outputs = net.getOutput();
for(int i = 0; i < inp; i++) {
out.println("Input: " + (i+1) + " : " + trainingInputs[j][i]);
}
for(int i = 0; i < outp; i++) {
out.println("Output: " + (i+1) + " : " + outputs[i]);
}
}
}
}

class Dendrite {
private double weight;
private int pointsTo;

public Dendrite() {
weight = 0;
pointsTo = 0;
}

public void setWeight(double weight) {
this.weight = weight;
}

public void setPointsTo(int pointsTo) {
this.pointsTo = pointsTo;
}

public double getWeight() {
return weight;
}

public int getPointsTo() {
return pointsTo;
}
}

class Neuron {
private int id;
private double value;
private double bias;
private double delta;
private Dendrite[] dendrites;

public Neuron(int dendritesCount) {
dendrites = new Dendrite[dendritesCount];
for(int i = 0; i < dendrites.length; i++) {
dendrites[i] = new Dendrite();
dendrites[i].setPointsTo(i);
}
}

public void setDendrites(int dendritesCount) {
dendrites = new Dendrite[dendritesCount];
for(int i = 0; i < dendrites.length; i++) {
dendrites[i] = new Dendrite();
dendrites[i].setPointsTo(i);
}
}

public Dendrite getDendrite(int index) {
return dendrites[index];
}

public double getDelta() {
return delta;
}

public void setDelta(double delta) {
this.delta = delta;
}

public int getId() {
return id;
}

public void setValue(double value) {
this.value = value;
}

public double getValue() {
return value;
}

public void setBias(double bias) {
this.bias = bias;
}

public double getBias() {
return bias;
}
}

class Layer {
private Neuron[] neurons;

public Layer(int size) {
neurons = new Neuron[size];
for(int i = 0; i < size; i++) {
neurons[i] = new Neuron(1);
}
}

public Neuron getNeuron(int index) {
return neurons[index];
}

public void setNeuron(Neuron neuron, int index) {
neurons[index] = neuron;
}
}

class Network {
private Random random = new Random();
private double learningRate;
private Layer[] layers;
private int totLayers;
private int[] neuronInLayer;
private double[] netInputs;
private double[] netOutputs;

public Network(double learningRate, int[] layers, int totLayers) {
if(totLayers < 2) throw new IllegalArgumentException("layer's count cannot be less than 2");
this.learningRate = learningRate;
neuronInLayer = new int[totLayers];
this.layers = new Layer[totLayers];
for(int i = 0; i < totLayers; i++) {
neuronInLayer[i] = layers[i];
this.layers[i] = new Layer(layers[i]);
}
netInputs = new double[layers[0]];
netOutputs = new double[layers[totLayers - 1]];
this.totLayers = totLayers;
}

public void setInputs(double[] inputs) {
for(int i = 0; i < neuronInLayer[0]; i++) {
layers[0].getNeuron(i).setValue(inputs[i]);
}
}

public void randomizeWeightAndBiases() {
for(int i = 0; i < totLayers; i++) {
for(int j = 0; j < neuronInLayer[i]; j++) {
if(i != (totLayers - 1)) {
layers[i].getNeuron(j).setDendrites(neuronInLayer[i + 1]);
for(int k = 0; k < neuronInLayer[i + 1]; k++) {
layers[i].getNeuron(j).getDendrite(k).setWeight(getRand());
}
}
if(i != 0) {
layers[i].getNeuron(j).setBias(getRand());
}
}
}
}

public double[] getOutput() {
double[] outputs = new double[neuronInLayer[totLayers - 1]];
for(int i = 1; i < totLayers; i++) {
for(int j = 0; j < neuronInLayer[i]; j++) {
layers[i].getNeuron(j).setValue(0);
for(int k = 0; k < neuronInLayer[i - 1]; k++) {
layers[i].getNeuron(j).setValue(layers[i].getNeuron(j).getValue() + layers[i - 1].getNeuron(k).getValue() * layers[i - 1].getNeuron(k).getDendrite(j).getWeight());
}
layers[i].getNeuron(j).setValue(layers[i].getNeuron(j).getValue() + layers[i].getNeuron(j).getBias());
layers[i].getNeuron(j).setValue(limiter(layers[i].getNeuron(j).getValue()));
}
}
for(int i = 0; i < neuronInLayer[totLayers - 1]; i++) {
outputs[i] = layers[totLayers - 1].getNeuron(i).getValue();
}
return outputs;
}

public void update() {
getOutput();
}

public double limiter(double value) {
return (1.0 / (1 + Math.exp(-value)));
}

public double getRand() {
return 2 * random.nextDouble() - 1;
}

public double sigmaWeightDelta(int layerNumber, int neuronNumber) {
double result = 0;
for(int i = 0; i < neuronInLayer[layerNumber + 1]; i++) {
result = result + layers[layerNumber].getNeuron(neuronNumber).getDendrite(i).getWeight() * layers[layerNumber + 1].getNeuron(i).getDelta();
}
return result;
}

public void train(double[] inputs, double[] outputs) {
double target, actual, delta;
setInputs(inputs);
update();
for(int i = totLayers - 1; i > 0; i--) {
for(int j = 0; j < neuronInLayer[i]; j++) {
if(i == totLayers - 1) {
target = outputs[j];
actual = layers[i].getNeuron(j).getValue();
delta = (target - actual) * actual * (1 - actual);
layers[i].getNeuron(j).setDelta(delta);
for(int k = 0; k < neuronInLayer[i - 1]; k++) {
double dendriteWeight = layers[i - 1].getNeuron(k).getDendrite(j).getWeight();
dendriteWeight += delta * learningRate * layers[i - 1].getNeuron(k).getValue();
layers[i - 1].getNeuron(k).getDendrite(j).setWeight(dendriteWeight);
}
layers[i].getNeuron(j).setBias(layers[i].getNeuron(j).getBias() + delta * learningRate * 1);
} else {
actual = layers[i].getNeuron(j).getValue();
delta = actual * (1 - actual) * sigmaWeightDelta(i, j);
for(int k = 0; k < neuronInLayer[i - 1]; k++) {
double dendriteWeight = layers[i - 1].getNeuron(k).getDendrite(j).getWeight();
dendriteWeight += delta * learningRate * layers[i - 1].getNeuron(k).getValue();
layers[i - 1].getNeuron(k).getDendrite(j).setWeight(dendriteWeight);
}
if(i != 0) {
layers[i].getNeuron(j).setBias(layers[i].getNeuron(j).getBias() + delta * learningRate * 1);
}
}
}
}
}
}

Per l'amor di tutti i santi, stacci attento perchè veramente non so il senso di quello che ho scritto :D.

E' un blocco unico per cui se copi il codice, lo incolli in un file "Main.java" e dai un javac Main.java, il compilatore sfrugullia tutto senza chiedere altro.

Syphilis
23-11-2006, 20:36
porca puzzola che lavorone grazie mille!!! :)

mi da un errore qui:

Scanner in = new Scanner(System.in);

Proprio all'inizio del codice settima righa...mi dice cannot find symbol :)
ora provo a smanettar un pò...speriam di capire!

t'adoro :sofico:

PGI-Bis
23-11-2006, 20:41
Ho usato la versione 5 di java. Se non trova Scanner forse usi la 1.4.

Syphilis
23-11-2006, 20:44
sei aggiornato eh! :) uhm ed ora come fo?

Syphilis
23-11-2006, 20:45
direi che è ora di scaricarmi la 5 :) ahhaha sta su sun immagino ve?

Syphilis
23-11-2006, 21:23
ma qual'è che devo scaricar?? ho istallata ed ho provato a metterla in netbeans ma nulla...persiste...

PGI-Bis
23-11-2006, 21:36
Da qui:

http://java.sun.com/javase/downloads/index.jsp

JDK 5.0 Update 9

se l'hai già scaricato e installato controlla che Netbeans lo usi. Dovrebbe esserci un pulsante sotto un tombino, dietro una pietra di fianco a un cespuglio che ti consente di farlo.

Syphilis
23-11-2006, 21:39
ok quella l'ho scaricata & installata ora tocca trovar il cescpuglio

Syphilis
23-11-2006, 21:50
niente uhm...non c'è una possibile sostituzione di Scanner?

PGI-Bis
23-11-2006, 21:56
Puoi usare BufferedReader.

public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintStream out = System.out;
int inp = 2, hid = 2, outp = 1;
int[] layers = { inp, hid, outp };
out.println("Enter number of training iterations: ");
int iter;
try {
iter = Integer.parseInt(in.readLine());
} catch(IOException ex) {
throw new RuntimeException(ex);
}

Syphilis
23-11-2006, 21:59
copio tutto questo al posto di quella righetta?

PGI-Bis
23-11-2006, 22:02
No.

Al posto di

Scanner in = new Scanner(System.in)

ci metti

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

e al posto di

int iter = in.nextInt();

ci metti:

int iter;
try {
iter = Integer.parseInt(in.readLine());
} catch(Exception ex) {
throw new RuntimeException(ex);
}

Syphilis
23-11-2006, 22:05
caro se sei di roma mi dai lezioni private ben retribuite?? :) ahahha