Błędne wyniki działania sieci neuronowej

0

Witam wszystkich forumowiczów forum 4programmers.
Mój problem jest następujący. Zaprogramowałem sieć neuronową w javie przy pomocy biblioteki Encog. Eclipse nie pokazuje żadnych błędów. Kompilacja poleceniem javac kończy się sukcesem. Jednak gdy uruchamiam program w środowisku Eclipse wyskakuje mi taki błąd:
Building Neural Network!Loading Data Set!Training Neural Network!Training File Exist:false
Error! Training Data File did'nt exist! Shutting down! <----------------------Do tego miejsca jest błąd wynikający z mojego kodu.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space <---------------------------Tu jest już błąd javy.
at org.encog.neural.networks.training.propagation.Propagation.<init>(Propagation.java:150)
at org.encog.neural.networks.training.propagation.resilient.ResilientPropagation.<init>(ResilientPropagation.java:147)
at org.encog.neural.networks.training.propagation.resilient.ResilientPropagation.<init>(ResilientPropagation.java:123)
at NeuralNetwork.main(NeuralNetwork.java:65)
Oto kod źródłowy:

import java.io.File;

import org.encog.Encog;
import org.encog.engine.network.activation.ActivationTANH;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;
import org.encog.persist.EncogDirectoryPersistence;
 
public class NeuralNetwork {
 
	public static void main(final String args[]) {
		
		File trainingdata = new File("C:\\Users\\Bartuś\\Pulpit\\TrainingData.csv");
		
		System.out.print("Building Neural Network!");
 
		// create a neural network, without using a factory
		BasicNetwork network = new BasicNetwork();
		network.addLayer(new BasicLayer(new ActivationTANH(),false,10000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,8000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,6000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,4000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,2000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,1000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,800));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,600));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,400));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,200));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,100));
		network.getStructure().finalizeStructure();
		network.reset();
		
		System.out.print("Loading Data Set!");
 
		// Loading Data Set
		MLDataSet trainingSet = getDataSet("C:\\Users\\Bartuś\\Pulpit\\TrainingData.csv");
		
		System.out.print("Training Neural Network!");
		
		boolean bool = trainingdata.exists();
		
		if(bool == false){
			System.out.println("Training File Exist:" +bool);
			System.out.println("Error! Training Data File did'nt exist! Shutting down!");
			Encog.getInstance().shutdown();
		}
 
		// Training Neural Network
		final ResilientPropagation train = new ResilientPropagation(network, trainingSet);
 
		int epoch = 1;
 
		do {
			train.iteration();
			System.out.println("Epoch #" + epoch + " Error:" + train.getError());
			epoch++;
		} while(train.getError() > 0.00000000001);
		train.finishTraining();
		
		System.out.print("Testing Neural Network!");
 
		// Testing Neural Network
		System.out.println("Neural Network Results:");
		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.print("Saving Trained Neural Network! Destroying Neural Network! Shutting down!");
		
		EncogDirectoryPersistence.saveObject(new File("C:\\Users\\Bartuś\\Pulpit\\NN.eg"), network);
		
		Encog.getInstance().shutdown();
	}

	private static MLDataSet getDataSet(String string) {
		return null;
	}
}

Ktoś ma pomysł. W załączniku zamieszczam bibliotekę Encog. W miarę możliwości proszę o szybkie odpowiedzi. Z góry dzięki.
PS. UDZIELAM pozwolenia na kopiowanie tego kodu i jego modyfikację we własnym zakresie. Popieram OpenSource ;).

0

A może właśnie z tego? Zauważ obecność polskiego znaku ś a kod rozumiem że jest w UTF-8? Może po prostu nie widzi pliku właśnie przez to?

 File trainingdata = new File("C:\\Users\\Bartuś\\Pulpit\\TrainingData.csv");

A to?

 network.addLayer(new BasicLayer(new ActivationTANH(),false,10000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,8000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,6000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,4000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,2000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,1000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,800));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,600));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,400));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,200));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,100));

To ile tych warstw zamierzasz dodawać i ile neuronów? Normalnie w większości zastosowań powinna wystarczyć jedna warstwa ukryta a tu jak rozumiem jest znacznie więcej?

0

Spróbowałem zamienić Bartuś. Nie działa. Zmniejszyłem ilość warstw, bez skutku. Nie spodziewałem się że to pomoże, ponieważ Eclipse wskazuje błąd powiązany z algorytmem propagacji. Ktoś ma jakieś inne sugestie?

0

Po pierwsze spróbuj przenieść plik na dysk C i odczytać go z tej lokalizacji.
Druga sprawa:

 BasicNetwork network = new BasicNetwork();
        network.addLayer(new BasicLayer(new ActivationTANH(),false,10000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,8000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,6000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,4000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,2000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,1000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,800));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,600));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,400));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,200));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,100));
        network.getStructure().finalizeStructure();
        network.reset();

Powinno wygłądać tak:

 BasicNetwork network = new BasicNetwork();
        network.addLayer(new BasicLayer(new ActivationTANH(),true,10000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,8000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,6000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,4000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,2000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,1000));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,800));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,600));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,400));
        network.addLayer(new BasicLayer(new ActivationTANH(),true,200));
        network.addLayer(new BasicLayer(new ActivationTANH(),false,100));
        network.getStructure().finalizeStructure();
        network.reset();

Polecam poczytać rozdział 4 https://s3.amazonaws.com/heatonresearch-books/free/Encog3Java-User.pdf

0

Ja myśle że java umiera z braku pamięci bo robisz tu jakaś kosmiczną sieć. Zacznij od jakiejś małej na kilka neuronów ;]

0

Jaki jest praktyczny sens stosowania tylu warstw ukrytych? Nie znam Encog od środka ale jak rozumiem tu jest po w pierwszej warstwie 10 tys neuronów, później 8 tys., 6 tys. itd? Biorąc pod uwagę to że w praktycznej realizacji jest połączenie każdy z każdym między sąsiadującymi warstwami to jest np. tak.

Warstwa wejściowa, 10 neuronów, w tym 1 ma na wejściu +1 albo -1 i jest używany jako bias. Warstwa ukryta: 20 neuronów, więc liczba połączeń to jest 10x10 a więc 100
Warstwa wyjściowa 2 neurony, 40 połączeń między tą warstwą a poprzednią warstwą ukrytą.

Jeśli tutaj jest 10K neuronów a dalej 8K to będzie 10K x 8K połączeń między tymi warstwami a więc 80 milionów!!! Między drugą a trzecią 8K x 6K a więc 48 milionów.

Jeśli tak to się nie dziwię że środowisko nie wyrabia. Rozumiem że na jest 10K wejść ale jakby zastosować dla przykładu strukturę 10K - 20K - 1k neuronów (warstwa wejściowa - ukryta - wyjściowa) to gdzie to może mieć do diabła praktyczne zastosowanie? Nie mieści mi się to w głowie.

0

Spróbowałem, nie działa.

0

Teraz pokazało się to:

Building Neural Network!Loading Data Set!Training Neural Network!Training File Exist:false
Error! Training Data File did'nt exist! Shutting down!
Exception in thread "main" java.lang.NullPointerException
	at org.encog.neural.networks.training.propagation.Propagation.init(Propagation.java:423)
	at org.encog.neural.networks.training.propagation.Propagation.calculateGradients(Propagation.java:339)
	at org.encog.neural.networks.training.propagation.Propagation.processPureBatch(Propagation.java:200)
	at org.encog.neural.networks.training.propagation.Propagation.iteration(Propagation.java:265)
	at org.encog.neural.networks.training.propagation.Propagation.iteration(Propagation.java:186)
	at NeuralNetwork.main(NeuralNetwork.java:70)

Kod wygląda teraz tak:

import java.io.File;

import org.encog.Encog;
import org.encog.engine.network.activation.ActivationTANH;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;
import org.encog.persist.EncogDirectoryPersistence;
 
public class NeuralNetwork {
 
	public static void main(final String args[]) {
		
		File trainingdata = new File("C:\\Users\\Bartuś\\Pulpit\\TrainingData.csv");
		
		System.out.print("Building Neural Network!");
 
		// create a neural network, without using a factory
		BasicNetwork network = new BasicNetwork();
		network.addLayer(new BasicLayer(new ActivationTANH(),false,1000));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,800));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,600));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,400));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,200));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,100));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,80));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,60));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,40));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,20));
		network.addLayer(new BasicLayer(new ActivationTANH(),true,10));
		network.getStructure().finalizeStructure();
		network.reset();
		
		System.out.print("Loading Data Set!");
 
		// Loading Data Set
		MLDataSet trainingSet = getDataSet("C:\\Users\\Bartuś\\Pulpit\\TrainingData.csv");
		
		System.out.print("Training Neural Network!");
		
		boolean bool = trainingdata.exists();
		
		if(bool == false){
			System.out.println("Training File Exist:" +bool);
			System.out.println("Error! Training Data File did'nt exist! Shutting down!");
			Encog.getInstance().shutdown();
		}
 
		// Training Neural Network
		final ResilientPropagation train = new ResilientPropagation(network, trainingSet);
 
		int epoch = 1;
 
		do {
			train.iteration();
			System.out.println("Epoch #" + epoch + " Error:" + train.getError());
			epoch++;
		} while(train.getError() > 0.00000000001);
		train.finishTraining();
		
		System.out.print("Testing Neural Network!");
 
		// Testing Neural Network
		System.out.println("Neural Network Results:");
		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.print("Saving Trained Neural Network! Destroying Neural Network! Shutting down!");
		
		EncogDirectoryPersistence.saveObject(new File("C:\\Users\\Bartuś\\Pulpit\\NN.eg"), network);
		
		Encog.getInstance().shutdown();
	}

	private static MLDataSet getDataSet(String string) {
		return null;
	}
}
0

Ile masz mieć w ogóle wejść i ile wyjść biorąc pod uwagę dane z tego pliku? Może wstawisz tu choć kilka linijek? Bo jak się analizuje dane z np. kilku zmiennych to jest kilka neuronów w warstwie wejściowej (tyle ile jest zmiennych wejściowych) no i może jeszcze +1 dla biasu. Czyli jak analizujesz dla przykładu funkcję 3 zmiennych do dajesz 4 neurony z czego 1 dla biasu i ma na wejściu stałą wartość np. +1.0. Warstwa ukryta dajmy na to 8 neuronów (na próbę), wyjściowa 1 neuron jeśli odpowiedź ma być jedną zmienną. Ale żeby z 10 warstw i tysiące neuronów?

0

Plik treningowy jest w podanej ścieżce, ale jest pusty. Czy to może mieć jakieś znaczenie? Dlaczego nie wczytuje pliku treningowego?

0

Tu jest przykład z XOR:
http://www.codeproject.com/Articles/52847/An-Introduction-to-Encog-Neural-Networks-for-Java

i nawet kody źródłowe do pobrania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1