Matrizenrechnung

OpaK

Aktives Mitglied
Du musst dir dazu nur eine Hilfsmethode schreiben, zum Beispiel, um eine nxm-Matrix mit einer mxn-Matrix zu multiplizieren:

Java:
    private List<List<String>> multiply(List<List<String>> a, List<List<String>> b) {
        List<List<String>> c = new ArrayList<>();
        for (int i = 0; i < a.size(); i++) {
            List<String> l1 = a.get(i);
            List<String> l3 = new ArrayList<>();
            for (int j = 0; j < b.get(i).size(); j++) {
                StringBuilder s = new StringBuilder();
                for (int k = 0; k < l1.size(); k++) {
                    List<String> l2 = b.get(k);
                    s.append("(").append(l1.get(k)).append(")*(").append(l2.get(j)).append(")+");
                }
                s = new StringBuilder(StringUtils.left(s.toString(), s.length() - 1));
                l3.add(s.toString());
            }
            c.add(l3);
        }
        return c;
    }

    private void printMat(String c, List<List<String>> m) {
        System.out.println(c + ":");
        for (List<String> list : m) {
            System.out.print("( ");
            for (String string : list) {
                System.out.print(string + " ");
            }
            System.out.println(")");
        }
    }

    private void printAndSolveMat(String name, List<List<String>> m) {
        System.out.println(name + ":");
        for (List<String> list : m) {
            System.out.print("( ");
            for (String string : list) {
                System.out.print(string + " ");
            }
            System.out.println(")");
        }
        System.out.println(name + ":");
        for (List<String> list : m) {
            System.out.print("( ");
            for (String string : list) {
                Node o = Compiler.compile(string);
                System.out.print(o.simplify().beautify() + " ");
            }
            System.out.println(")");
        }
        System.out.println(name + ":");
        for (List<String> list : m) {
            System.out.print("( ");
            for (String string : list) {
                Node o = Compiler.compile(string);
                System.out.print(o.simplify().beautify().val() + " ");
            }
            System.out.println(")");
        }
    }

"Compiler.compile(string).simplify().beautify().val()" ist die Magie.
 

OpaK

Aktives Mitglied
Stimmt, das Was? ist ganz einfach, aber das Wie? und Warum? schon heftiger bei ANNs...

(Leider) ist das Thema AI sehr mit Python besetzt... Java wurde dabei kaum in Erwägung gezogen
 

stev.glasow

Mitglied
Ich lasse das wohl lieber mit dem Python-Code in Java umsetzen und fange nochmal von vorne an. Könnt ihr mir ein deutsches -Neuronale Netze Programmieren in Java - Buch empfehlen?
 

OpaK

Aktives Mitglied
Hm. Gemini meint ND4J und Tensorflow Java sind nicht kompatibel .
Wie ich schon sagte, die Vorschläge taugen nix.

Allerdings hatte ich jas vorgeschlagen, bevor ich wusste dass es nicht um allgemeine Mathematik geht, sondern um ANN s...

Für ANNs kann Java verwendet werden, aber das ist dann nicht so schnell, vermutlich - auch wenn ND4J die zugrunde liegende Hardware abstrahiert und native C++-Bibliotheken nutzt.

Ich würde klein anfangen. Vielleicht ein 50x50 Netz entwerfen, das nur einen Buchstaben klassifizieren kann. Dann geht's weiter.
 

JCODA

Top Contributor
Tut mir leid, wenn ich der Spielverderber bin, aber: Java und maschinelles Lernen sind einfach nicht kompatibel. Das winzige Stückchen Python-Wissen, welches man braucht um produktiv zu sein, ist so wenig im Vergleich dazu wie viel man über NN/ML insgesamt lernen kann. In Java
Du musst dir dazu nur eine Hilfsmethode schreiben, zum Beispiel, um eine nxm-Matrix mit einer mxn-Matrix zu multiplizieren:

Java:
    private List<List<String>> multiply(List<List<String>> a, List<List<String>> b) {
        List<List<String>> c = new ArrayList<>();
       
    }
Das ist nicht dein Ernst? Solch ein Code sollte nicht existieren, nicht einmal wenn es drum geht, wie man das theoretisch machen könnte...

Es geht um Performance. Ständiges String-Parsen und toString-Gedöns macht alles um mehrere Größenordnungen langsamer. Außerdem möchte man natürlich optimierten SIMD-Code für solche Operationen nutzen.
 

stev.glasow

Mitglied
Das Ding ist das ich keine Lust habe ein Teil in Python (die KI) und den Rest(z.B. die GUI) in Java zu schreiben. Auf ne Python-tkinter-gui z.B. habe ich kein Bock. Ich möchte das ganze Projekt in Java umsetzen. Wo liegt den das Problem bei ANNs in Zusammenhang mit Java?
 

stev.glasow

Mitglied
Jo. Hab mich etwas informiert und Tensorflow Java sieht gut aus - das ist ein Tensorflow wrapper und man kommt komplett ohne Python aus - schreibt alles in Java. Es enthält die ndarray-Bibliothek die als Äquivalent zu numpy gilt - was ja mein ursprüngliches Problem war.
 

stev.glasow

Mitglied
Tensorflow Python und Tensorflow Java sollen übrigens gleich schnell sein - es sind beides Wrapper für das in c++ geschriebene Tensorflow. Aber Java schlägt meiner Meinung nach Python in Performance, GUI- und Serverprogrammierung.
 

OpaK

Aktives Mitglied
Ich glaube, die wichtigen Fragen wären, soll es erst einmal einfach "nur" funktionieren oder soll es gleichzeitig auch schnell sein. Ich würde eine stufenartige Herangehensweise wählen, aber ich kenne deinen Kenntnisstand nicht.

Bei mir ists so, dass ich lieber schnell kleine Erfolge sehen will, anstatt die Architektur aufzublähen.
 

OpaK

Aktives Mitglied
Lustig, habe gerade ein LSTM RNN ANN mithilfe von deeplearning4j und nd4j und shadowJar implementiert (ihr könnt euch bestimmt denken, wieso) und das entstandene jar bzw. zip File ist über 1 GB groß und enthält mehr als 32.000 Entries... Wer es nicht glaubt, bitte selber überzeugen:

Code:
dependencies {
    // Logging...
    implementation "org.apache.logging.log4j:log4j-core:$log4jVers"
    implementation "org.apache.logging.log4j:log4j-plugins:$log4jVers"
    implementation "org.apache.logging.log4j:log4j-config-properties:$log4jVers"
    implementation 'org.slf4j:slf4j-simple:2.1.0-alpha1'

    // Die Deeplearning4j Kernbibliothek
    implementation 'org.deeplearning4j:deeplearning4j-core:1.0.0-M2.1'
    // Das CPU-Backend für die mathematischen Berechnungen (ND4J)
    implementation 'org.nd4j:nd4j-native:1.0.0-M2.1'
    // Plattform-spezifische Binärdateien für das CPU-Backend (automatische Erkennung)
    implementation 'org.nd4j:nd4j-native-platform:1.0.0-M2.1'
}


jar.enabled = false
tasks.named('distZip').configure { enabled = false }
tasks.named('distTar').configure { enabled = false }
tasks.named('startScripts').configure { enabled = false }

tasks.shadowJar {
    setProperty("zip64", true)

    duplicatesStrategy = DuplicatesStrategy.INCLUDE
    mergeServiceFiles()
}

Ich bin mir noch nicht sicher, weshalb das zip file so groß ist... Die genaue LSTM-Implementierung ist aber "geheim" und darf ich deshalb nicht zeigen.
 

stev.glasow

Mitglied
Ich glaube, die wichtigen Fragen wären, soll es erst einmal einfach "nur" funktionieren oder soll es gleichzeitig auch schnell sein. Ich würde eine stufenartige Herangehensweise wählen, aber ich kenne deinen Kenntnisstand nicht.

Bei mir ists so, dass ich lieber schnell kleine Erfolge sehen will, anstatt die Architektur aufzublähen.
Hallo,
Ich möchte erstmal einfach das Python Buch durcharbeiten und den Python-Code in Java umsetzen. Ich befolge deinen Rat und baue erstmal kleinere Strukturen auf.
 

OpaK

Aktives Mitglied
Ich dachte, Java sollte als "Middleware" dienen? 🤔 Jetzt doch nicht? Ich bin gerade erst mit Dl4j warm geworden.

Hatte auch schon das erste Speicherleck, da von C allokierter Arbeitsspeicher nicht automatisch wieder freigegeben wurde. (Ctor und dtor lassen grüßen.)
 

stev.glasow

Mitglied
Alles in Ordnung. Mir geht es eigentlich die ganze Zeit darum, dass das Buch Python-Code verwendet und mit numpy und Tensorflow arbeitet. Dafür habe ich was Java kompatibles gesucht und gefunden. Das ist mir aber alles sehr kompliziert und ich muss mich dort erst noch reinfinden. Teilweise hapert es auch einfach an meinem mathematischen Verständnis. Ich habe mir jetzt auch zusätzlich noch ein Mathematikbuch besorgt.
 

OpaK

Aktives Mitglied
Hatte auch nur eine Künstliche Intelligenz-Vorlesung. Es gibt in der Domäne jedoch Formeln, die mehr oder weniger als gegeben und gleichzeitig als ausreichend funktionierend angesehen werden, und somit keiner weiteren mathematischen Abklärung oder Begründung bedürfen... Sobald du über ~ "Sigmoid" stolperst, bist du auf dem richtigen Weg. ☺
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Klonen von Arrays/ Matrizenrechnung Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben