Variablen Variablen mit unendlichem Wert

CreepyPvP

Mitglied
Ich schreibe derzeit an einem kleinem Neuronalen Netz. Das Problem ist , dass die Float Variable , die als Ausgabe dient den Wert -Infinity hat. Wie kommt so etwas zustande ?
 

CreepyPvP

Mitglied
ohne Code könnten wir nur raten, wo Du da was falsch macht ...
Hier wäre der Code :
Klasse Neuron
Java:
package CreepyNet;

public abstract class Neuron {

    public abstract float getValue();
  
}
Klasse InputNeuron
Java:
package CreepyNet;

public class InputNeuron extends Neuron{

    private float value;
  
    public void setValue(float value) {
        this.value = value;
    }
  
    @Override
    public float getValue() {
        return value;
    }
  
}
Klasse WorkingNeuron
Java:
package CreepyNet;

import java.util.ArrayList;

public class WorkingNeuron extends Neuron{
  
    private ArrayList<Conection> connections;
  
    public WorkingNeuron() {
        connections = new ArrayList<>();
    }
  
    @Override
    public float getValue() {
        float v = 0;
        for (Conection c : connections) {
            v += c.getValue();
        }
        return v;
    }
  
    public void addConnection(Neuron target, float w) {
        connections.add(new Conection(target, w));
    }
  
    ArrayList<Conection> getConnections() {
        return connections;
    }
  
    public void deltaLearning(float diff, float lernfaktor) {
        for (int i = 0; i < connections.size(); i++) {
            float DeltaWeigth = lernfaktor * diff * connections.get(i).getValue();
            connections.get(i).w += DeltaWeigth;
            System.out.println(connections.get(i).w);
        }
    }
  
}
Klasse NeuralNetwork
Java:
package CreepyNet;

import java.util.ArrayList;
import java.util.Random;

import javax.management.RuntimeErrorException;

public class NeuralNetwork {

    private ArrayList<InputNeuron> inputs;
    private ArrayList<WorkingNeuron>[] layer;
  
    public NeuralNetwork(int layerCount) {
        layer = new ArrayList[layerCount];
        for (int i = 0; i < layerCount; i++) {
            layer[i] = new ArrayList<WorkingNeuron>();
        }
        inputs = new ArrayList<InputNeuron>();
    }
  
    public ArrayList<WorkingNeuron> getOutputs() {
        return layer[0];
    }
  
    public ArrayList<InputNeuron> getInputs() {
        return inputs;
    }
  
    public InputNeuron createInput() {
        InputNeuron neu = new InputNeuron();
        inputs.add(neu);
        return neu;
    }
  
    public WorkingNeuron createWorkingNeuron(int layer) {
        if (layer >= this.layer.length) {
            throw new RuntimeException();
        }
        WorkingNeuron neu = new WorkingNeuron();
        this.layer[layer].add(neu);
        return neu;
    }
  
    public void createFullMeshWithRandomWeigths(int layer, float max) {
        if (layer >= this.layer.length || layer < 0) {
            throw new RuntimeException();
        }
        Random r = new Random();
        if (layer == 0) {
            for (WorkingNeuron currentNeuron : this.layer[layer]) {
                for (InputNeuron currentConnection : inputs) {
                    currentNeuron.addConnection(currentConnection, (r.nextFloat() % max) + 0.1f);
                }
            }
            return;
        }
        for (WorkingNeuron currentNeuron : this.layer[layer]) {
            for (WorkingNeuron currentConnection : this.layer[layer - 1]) {
                currentNeuron.addConnection(currentConnection, r.nextFloat() % max);
            }
        }
    }
  
    public void createFullMesh(int layer, float... weigths) {
        if (layer >= this.layer.length || layer < 0) {
            throw new RuntimeException();
        }
        if (layer == 0) {
            int index = 0;
            for (WorkingNeuron currentNeuron : this.layer[layer]) {
                for (InputNeuron currentConnection : inputs) {
                    currentNeuron.addConnection(currentConnection, weigths[index]);
                    index++;
                }
            }
            return;
        }
        int index = 0;
        for (WorkingNeuron currentNeuron : this.layer[layer]) {
            for (WorkingNeuron currentConnection : this.layer[layer - 1]) {
                currentNeuron.addConnection(currentConnection, weigths[index]);
                index++;
            }
        }
    }
  
    public InputNeuron[] createInputNeuronArray(int size) {
        InputNeuron[] r = new InputNeuron[size];
        for (int i = 0; i < size; i++) {
            r[i] = createInput();
        }
        return r;
    }
  
    public void deltaLearning(float[] sollWert, float lernfaktor) {
        if (layer.length == 1 && sollWert.length != layer[0].size()) {
            throw new RuntimeException();
        }
        for (int i = 0; i < sollWert.length; i++) {
            float diff = sollWert[i] - layer[0].get(i).getValue();
            layer[0].get(i).deltaLearning(diff, lernfaktor);
        }
    }
  
}
Klasse Conection
Java:
package CreepyNet;

public class Conection {

    public Conection(Neuron target, float w) {
        neuron = target;
        this.w = w;
    }

    float w;
    Neuron neuron;
  
    public float getValue() {
        return neuron.getValue() * w;
    }
  
}
Klasse Tester
Java:
package CreepyNet;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import NeuronalesNetz.Test;

public class Tester {

    public static void main(String[] args) {
        NeuralNetwork net = new NeuralNetwork(1);
        InputNeuron[] input = net.createInputNeuronArray(256);
        WorkingNeuron dirt = net.createWorkingNeuron(0);
        WorkingNeuron ice = net.createWorkingNeuron(0);
        net.createFullMeshWithRandomWeigths(0, 1);
      
        float[] dirtData = getImage16x16("dirt.png");
        float[] iceData = getImage16x16("ice.png");
      
        learnData(dirtData, new float[] {1f,0f}, 1f, 10, net);
      
        System.out.println(dirt.getValue());
        System.out.println(ice.getValue());
    }
  
    public static float[] getImage16x16(String name) {
        BufferedImage img;
        float[] r;
        try {
            img = ImageIO.read(Tester.class.getResourceAsStream(name));
            r = new float[256];
            for (int i = 0; i < 16; i++) {
                for (int j = 0; j < 16; j++) {
                    r[i * 16 + j] = img.getRGB(i, j);
                }
            }
            return r;
        } catch (IOException e) {
            e.printStackTrace();
            r = null;
            return r;
        }
    }
  
    public static void learnData(float[] in, float[] out, float lernfaktor, int anzahl, NeuralNetwork net) {
        for (int i = 0; i < net.getInputs().size(); i++) {
            net.getInputs().get(i).setValue(in[i]);
        }
        for (int j = 0; j < anzahl; j++) {
            net.deltaLearning(out, lernfaktor);
        }
    }
  
}
Gibt es noch anddere Wege den Wert -Infinity zustandezubringen ? Denn im meinem gesamten Code kommt kein einziges mal "/" vor.
Grüsse Creepy
 

Thallius

Top Contributor
Ich würde mir mal die Anzahl der Connections ausgeben lassen. Wenn die groß genug werden dann werden auch deine Zahlen entsprechend groß.
 

CreepyPvP

Mitglied
Die Anzahl beträgt 512. 2 Output Neuronen mit jeweils einer Verbindung zu jedem Pixel des Bildes. Bei einer Bildgrösse von 16 auf 16 Pixel sind es 256 Pixel.
 

fhoffmann

Top Contributor
Zum Beispiel so:
Java:
public class Test {
   public static void main(String[] args) {
      float f = -1.0f / 0.0f;
      System.out.println(f);   // Ausgabe: -Infinity
      System.out.println(f-f); // Ausgabe: NaN
   }
}
 

CreepyPvP

Mitglied
warum setzt du nicht einfach mal einen BreakPoint und debuggst das ganze statt rumzuraten?
Ja ich habe die Fehler Stelle gefunden, weiss aber nicht , warum dieser Fehler ensteht :
0.1 * -3.9443458E20 * 4.7511674E19 = -Infinity
0.1 * -3.9443458E20 * 3.469229E20 = -Infinity
0.1 * -1.8462315E21 * 3.1463255E20 = -Infinity
0.1 * -1.8462315E21 * 1.531599E21 = -Infinity
(Ich habe ein paar Ausgaben generieren lassen)
Das passiert an einer Stelle in der WorkingNeuron Klasse :
Code:
public void deltaLearning(float diff, float lernfaktor) {
        for (int i = 0; i < connections.size(); i++) {
            float DeltaWeigth = lernfaktor * diff * connections.get(i).getValue(); //Hier ensteht der Fehler!!!!
            System.out.println(lernfaktor + " * " + diff + " * " + connections.get(i).getValue() + " = " + DeltaWeigth); // Hier sind die Ausgaben enstanden !
            connections.get(i).addWeigth(DeltaWeigth);
        }
    }
Wodurch wird hier die Aufgabe falsch ausgerechnet. Meine Vermutung war , dass die Zahlen zu viele Dezimalen besitzen. Gäbe es da einen Weg die Stellen nach x Dezimalen einfach abzuschneiden ?
Grüsse Creepy
 

Meniskusschaden

Top Contributor
Mit Nachkommastellen hat das nichts zu tun. Die Werte sind einfach zu groß für den Datentyp float. Sind die Zahlen denn richtig? Dann kannst du überlegen, ob double ausreicht. Oder sind sie falsch? Dann mußt du die Ursache dafür finden.
 

CreepyPvP

Mitglied
Sind die Zahlen denn richtig?
Ich denke, dass die Zahlen richtig sind.
Dann kannst du überlegen, ob double ausreicht.
Leider auch nicht.
Die Werte sind einfach zu groß für den Datentyp float.
Wie zu groß?
Mit Nachkommastellen hat das nichts zu tun
Ist 0.1 * 4 * 5 zu groß für float?
 

Meniskusschaden

Top Contributor
Gäbe es da einen Weg die Stellen nach x Dezimalen einfach abzuschneiden ?
Dann würde da nicht
0.1 * -394434580000000000000 * 47511674000000000000
sondern vielleicht nur noch 0.1 * -39443458 * 47511674 stehen
Nein, da würde dann eher so etwas stehen:
0.1 * -300000000000000000000 * 40000000000000000000
Die Nachkommastellen von beispielsweise 1.23456E3 sind ja nicht 23456 sondern 56, denn es handelt sich um die Zahl 1234,56. Bezüglich der Größenordnung würde sich also nichts Wesentliches ändern.

Es hindert dich natürlich niemand daran, einfach 0.1 * -39443458 * 47511674 zu berechnen. Nur wozu soll das gut sein? Wenn du das Ergebnis von 0.1 * -3.9443458E20 * 4.7511674E19 gar nicht benötigst, kannst du die Berechnung auch gleich ganz weglassen. Und wenn du es benötigst, bringt es dir doch nichts, etwas ganz anderes auszurechnen. Oder willst du danach die entsprechende Anzahl von Nullen wieder anhängen? Dann wäre das Ergebnis aber wieder zu groß für float.

Aus #16 ergibt sich, dass du eigentlich 0.1 * 4 * 5 (also 2) für richtig oder zumindest plausibel hältst. Das Ergebnis von 0.1 * -3.9443458E20 * 4.7511674E19 ist aber ungefähr folgendes:
-1874000000000000000000000000000000000000
Das ist ja nun nicht exakt dasselbe wie 2. Ich kann nicht nachvollziehen, warum du die Zahlen gar nicht hinterfragst, sondern sie trotzdem ausrechnen willst, obwohl sie offensichtlich völlig von deinem erwarteten Ergebnis abweichen.
 

MiMij

Bekanntes Mitglied
Wenn du ein Programm schreibst, solltest du bei Berechnungen auch verstehen welche Zahlen wo rauskommen (sollten) um dann weiter zu verstehen was schief geht. Wenn ich also zb eine Addition von 2 Zahlen hab und ich erwarte das 5 rauskommt, das passiert aber nicht, dann schau ich mir die Zahlen an welche er benutzt hat für die Addition. Eventuell erwarte ich auch das die erste Zahl eine 2 ist, dann weiß ich das die zweite eine 3 sein muss, ist dies nicht der Fall muss ich prüfen warum diese Zahlen nicht stimmen. Und nicht einfach wieterhin das ERgebnis in Frage stellen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
A JavaCC: Variablen zaehlen Allgemeine Java-Themen 12
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5
M Variablen in einer .doc Vorlage ersetzen Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
E Zugriff auf Variablen äusserer Klassen Allgemeine Java-Themen 2
M Variablen in Klasse verpacken? Allgemeine Java-Themen 10
F Allegemeiner Datentyp für Objekte und Primitive Variablen Allgemeine Java-Themen 6
W Array mit Variablen aus Vararg füllen Allgemeine Java-Themen 4
S Problem mit Boolean Variablen Allgemeine Java-Themen 8
A [SOLVED] Classpath und statische Variablen Allgemeine Java-Themen 6
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
C klassenübergreifende variablen Allgemeine Java-Themen 3
J 28 Variablen vergleichen und die höchsten addieren Allgemeine Java-Themen 15
T ungewollter Zugriff auf private Variablen? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben