[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung

Einführung

Es gibt ein Buch mit dem Titel "Deep Learning von Grund auf neu Die Theorie und Implementierung von Deep Learning, das mit Python gelernt wurde". Ich habe es zweimal gelesen, aber ich glaube, ich verstehe es, ich verstehe es nicht. Da es als Java-Entwickler in erster Linie in Python implementiert ist, habe ich das Gefühl, dass es getäuscht wurde. Aufgrund der dynamischen Typisierung sind die Argumente derselben Methode manchmal Zahlen und manchmal Arrays, je nachdem, was der Aufrufer übergibt ... zu knifflig ... ~~ Was Sie gehorsam über Deeplearning4j lernen sollten ~~ "Ja, lassen Sie es uns in Java implementieren". Weitere Informationen finden Sie im Buch, da es nur implementiert ist.

Differenzierung vorerst

Ist es überhaupt möglich, Differenzierung und Gradienten in Java zu implementieren (P97 4.3 Numerische Differenzierung / P03 4.4 Gradient)? Wenn ich es nicht kann, denke ich nicht, dass es passieren wird, also habe ich es vorerst versucht (Java 8 oder höher).

ArrayUtil.java


private static double h = 1e-4; //Sehr kleine Anzahl
public double numericalDiff(DoubleUnaryOperator func, double x){
	return (func.applyAsDouble(x + h) - func.applyAsDouble(x-h))/ (2*h);
}

Der Inhalt des Tests ist P103. Es ist genau wie das Buch, also gilt es als gut.

ArrayUtilTest.java


@Test
public void numericalDiff1(){
	assertThat(target.numericalDiff(p-> p*p+4*4, 3.0), is(6.00000000000378));
	assertThat(target.numericalDiff(p-> 3*3+p*p, 4.0), is(7.999999999999119));
}

Als nächstes teilweise Differenzierung

P104 des Buches implementiert. ~~ In der Buchimplementierung (Python) wird der ursprüngliche Wert tmp_val zugewiesen und nach der Berechnung auf den ursprünglichen Wert zurückgesetzt. Wenn Sie dies jedoch in Java tun, ändern sich die Originaldaten schließlich, da das Referenzziel dasselbe ist. Daher wird eine tiefe Kopie verwendet, um die Originaldaten zu speichern. ~~ → Ich habe einen Kommentar erhalten, dass es kein Problem gibt, wenn ich sofort nach der Substitution berechne. Es ist vernünftig.

ArrayUtil.java


private static double h = 1e-4; //Sehr kleine Anzahl
public double[][] numericalGradient(ToDoubleFunction<double[][]> func, double[][] x){

	int cntRow = x.length;
	int cntCol = x[0].length;

	double[][] result = new double[cntRow][cntCol];
	for (int i=0; i < cntRow; i++){
		for (int j=0; j < cntCol; j++){

			double[][] xPlus = deepCopy(x);
			xPlus[i][j] = xPlus[i][j] + h;

			double[][] xMinus = deepCopy(x);
			xMinus[i][j] = xMinus[i][j] - h;

			result[i][j] = (func.applyAsDouble(xPlus) - func.applyAsDouble(xMinus))/ (2*h);
		}
	}

	return result;
}

public double[][] deepCopy(double[][] x){
	double[][] copy = new double[x.length][];
	for (int i = 0; i < copy.length; i++){
		copy[i] = new double[x[i].length];
		System.arraycopy(x[i], 0, copy[i], 0, x[i].length);
	}
	return copy;
}

Der Inhalt des Tests ist P104. Ebenso wird es als gut angesehen, weil es dem Buch entspricht.

ArrayUtilTest.java


@Test
public void numericalGradient(){

	ToDoubleFunction<double[][]> function = p-> p[0][0] * p[0][0] + p[0][1]*p[0][1];
	double[][] x = {{3,4}};
	double[][] result = target.numericalGradient(function, x);

	assertThat(result[0][0], is(6.00000000000378));
	assertThat(result[0][1], is(7.999999999999119));

	result = target.numericalGradient(function, new double[][]{{0,2}});

	assertThat(result[0][0], is(closeTo(0.0, 0.000001)));
	assertThat(result[0][1], is(closeTo(4.0, 0.000001)));
}

abschließend

Differenzierung und teilweise Differenzierung scheinen in Ordnung zu sein. Übrigens habe ich alle implementiert. Das Problem ist, dass der PC langsam ist und ich nicht überprüfen kann, ob er endlich die richtigen Ergebnisse ausgibt oder

Recommended Posts

[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Lernen Sie Deep Learning von Grund auf in Java.
[Deep Learning von Grund auf neu] in Java 3. Neuronales Netzwerk
Deep Learning Java von Grund auf 6.4 Regularisierung
Erste Schritte für tiefes Lernen in Java
Deep Learning Java von Grund auf neu Kapitel 1 Einführung
Deep Learning Java von Grund auf 6.1 Parameteraktualisierung
Zum ersten Mal Java lernen [Einführung]
Deep Learning Java von Grund auf neu Kapitel 2 Perceptron
Deep Learning Java von Grund auf 6.3 Batch-Normalisierung
Deep Learning von Grund auf neu Java Kapitel 4 Lernen neuronaler Netze
Schnellstes PC-Setup für tiefes Lernen von Grund auf
Verwenden Sie vorerst eine externe Java-Bibliothek
Deep Learning Java von Grund auf neu Kapitel 3 Neuronales Netzwerk
[Deep Learning von Grund auf neu] 2. In Java gibt es kein NumPy.
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Deep Learning Java von Grund auf 6.2 Anfangswert des Gewichts
Betreten Sie Docker-Compose vorerst und lernen Sie Docker, während Sie das grundlegende Design des Webservers (Nginx) lernen
Deep Learning Java von Grund auf neu Kapitel 5 Methode zur Fehlerrückübertragung
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
[DL4J] Erstes Java Deep Learning (Handschriftliche Zeichenerkennung über ein vollständig verbundenes neuronales Netzwerk)
[Lernaufzeichnung] Ich habe die aktuelle Zeit mit Ruby erhalten und für jedes Mal eine andere Begrüßung ausgegeben.
Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Einführung in Java zum ersten Mal # 2
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
[Socket-Kommunikation (Java)] Eindrücke von der erstmaligen Implementierung der Socket-Kommunikation in der Praxis
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Erste Programmierung in meinem Leben Java 1st Hello World
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
In Bezug auf transiente Modifikatoren und Serialisierung in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
Die Geschichte des Lernens von Java in der ersten Programmierung
Spüren Sie den Lauf der Zeit auch in Java
Erfassen und speichern Sie die Selen-Installation in Java
Installieren Sie vorerst Amazon Corretto (Vorschau)
Für JAVA-Lernen (2018-03-16-01)
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Java-Sprache aus der Sicht von Kotlin und C #
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
Versuchen Sie vorerst, Spring Cloud Config auszuführen
In der Abbildung verstandene Java-Klassen und -Instanzen
Dies und das zum Bearbeiten von ini in Java. : inieditor-java
Befehl, um Docker vorerst zu verwenden
In Java 2D-Karte speichern und mit for-Anweisung drehen
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
[Java] Machen Sie die Variablen der erweiterten for-Anweisung und für jede Anweisung unveränderlich
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
Objektorientiertes Kind !? Ich habe Deep Learning mit Java ausprobiert (Testversion)
Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst