Błędne wyniki działania sieci neuronowej

Odpowiedz Nowy wątek
2015-08-19 15:57
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 ;).

edytowany 6x, ostatnio: BASH, 2015-08-19 16:58

Pozostało 580 znaków

2015-08-19 16:04
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?

edytowany 1x, ostatnio: drorat1, 2015-08-19 16:06

Pozostało 580 znaków

2015-08-19 16:52
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?

Pozostało 580 znaków

2015-08-19 17:07
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/heat[...]ooks/free/Encog3Java-User.pdf

Pozostało 580 znaków

2015-08-19 17:50
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 ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-08-19 18:23
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.

edytowany 1x, ostatnio: drorat1, 2015-08-19 18:23

Pozostało 580 znaków

2015-08-19 18:25
Mały Lew
0

Spróbowałem, nie działa.

Pozostało 580 znaków

2015-08-19 18:29
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;
    }
}
edytowany 1x, ostatnio: BASH, 2015-08-19 18:31
Nie widzi pliku z zestawem treningowym. - drorat1 2015-08-19 18:31

Pozostało 580 znaków

2015-08-19 18:31
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?

Pozostało 580 znaków

2015-08-19 18:34
0

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

No to jak ty chcesz tą sieć nauczyć? Plik musi mieć odpowiednią ilość danych liczbowych i to w odpowiednim formacie a tu może chodzić o CSV. Może pobiorę Encog to zobaczę przynajmniej na XOR to napiszę. - drorat1 2015-08-19 18:43
Nie wiem jeszcze jakie będzie jej zastosowanie. Stworzyłem pusty plik żeby sprawdzić czy wszystko dobrze zaprogramowałem. Jednak teraz widzę że nie bardzo. - BASH 2015-08-19 18:46
Tak jak pisałem, poczytaj sobie https://s3.amazonaws.com/heat[...]ooks/free/Encog3Java-User.pdf elegancko wszystko opisane, zrób dwa, trzy przykłady jakieś bardzo proste to od razu załapiesz. - podroznik 2015-08-19 18:53

Pozostało 580 znaków

2015-08-19 19:01
0

Tu jest przykład z XOR:
http://www.codeproject.com/Ar[...]ncog-Neural-Networks-for-Java

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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