[Deep Learning von Grund auf neu] in Java 3. Neuronales Netzwerk

Einführung

[Deep Learning von Grund auf in Java] 2. NumPy gibt es nicht. ](Https://qiita.com/xaatw0/items/011168383246d4e95145) Es ist eine Fortsetzung von. Ich trat schließlich in das neuronale Netzwerk ein und es wurde mehr wie tiefes Lernen.

Aktivierungsfunktion

Erstens ist es eine übliche Methode, die die angegebene Funktion auf alle Elemente des zweidimensionalen Arrays anwendet.

ArrayUtil.java


public double[][] apply(double[][] x, DoubleUnaryOperator op){

	validate(x);
	double[][] result = new double[x.length][x[0].length];
	for (int i = 0; i < result.length; i++){
		for (int j = 0; j < result[0].length; j++){
			result[i][j] = op.applyAsDouble(x[i][j]);
		}
	}

	return result;
}

Es ist P48 "3.2.4 Implementierung der Sigmoidfunktion" des Buches. Math.exp, was gut für Java war.

ArrayUtil.java


private DoubleUnaryOperator sigmoid = p ->1/(1+ Math.exp(-1 * p));
public double[][] sigmoid(double[][] x){
	return apply(x, sigmoid);
}

Als nächstes P52 "3.2.7 ReLU-Funktion".

ArrayUtil.java


private DoubleUnaryOperator relu = p -> p < 0 ? 0 : p;
public double[][] relu(double[][] x){
	return apply(x, relu);
}

neurales Netzwerk

P65 "3.4.3 Implementierungszusammenfassung"

ArrayUtilTest.java


public void newralnetwork(){
	// init_network()
	double[][] W1 = {{0.1, 0.3, 0.5},{0.2, 0.4, 0.6}};
	double[]   b1 = {0.1, 0.2, 0.3};
	double[][] W2 = {{0.1,0.4},{0.2,0.5},{0.3,0.6}};
	double[]   b2 = {0.1, 0.2};
	double[][] W3 = {{0.1,0.3},{0.2,0.4}};
	double[]   b3 = {0.1, 0.2};

	// x - np.array([1.0, 0.5])
	double[][] x = {{1.0, 0.5}};

	// a1 = np.dot(x,W1)+b1
	double[][] a1 = target.plus( target.multi(x, W1), b1);

	// z1 = sigmoid(a1)
	double[][] z1 = target.sigmoid(a1);

	assertThat(z1[0][0], is(closeTo(0.57444252, 0.00001)));
	assertThat(z1[0][1], is(closeTo(0.66818777, 0.00001)));
	assertThat(z1[0][2], is(closeTo(0.75026011, 0.00001)));

	// a2 = np.dot(z1,W2)+b2
	double[][] a2 = target.plus( target.multi(z1, W2), b2);

	// z2 = sigmoid(a2)
	double[][] z2 = target.sigmoid(a2);
	assertThat(z2[0][0], is(closeTo(0.62624937, 0.00001)));
	assertThat(z2[0][1], is(closeTo(0.7710107, 0.00001)));

	// a3 = np.dot(z2,W3)+b3
	double[][] a3 = target.plus( target.multi(z2, W3), b3);

	// print(y) #[0.31682708,0.69627909]
	assertThat(a3[0][0], is(closeTo(0.31682708, 0.00001)));
	assertThat(a3[0][1], is(closeTo(0.69627909, 0.00001)));
}

Design der Ausgabeschicht

Implementierung der Softmax-Funktion aus P69 "3.5.2 Vorsichtsmaßnahmen zur Implementierung der Softmax-Funktion".

ArrayUtil.java


public double[] softmax(double[] x){
	double maxValue = Arrays.stream(x).max().getAsDouble();
	double[] value = Arrays.stream(x).map(y-> Math.exp(y - maxValue)).toArray();
	double total = Arrays.stream(value).sum();
	return Arrays.stream(value).map(p -> p/total).toArray();
}

public double[][] softmax(double[][] x){
	double[][] result = new double[x.length][];
	for (int i = 0; i < result.length; i++){
		result[i] = softmax(x[i]);
	}
	return result;
}

ArrayUtilTest.java


ArrayUtil target = new ArrayUtil();

@Test
public void softmax(){
	double[] x = {1010, 1000, 990};
	double[] expected = {9.99954600e-01, 4.53978686e-05, 2.06106005e-09};

	double[] result = target.softmax(x);
	assertThat(result[0], is(closeTo(expected[0], 0.00001)));
	assertThat(result[1], is(closeTo(expected[1], 0.00001)));
	assertThat(result[2], is(closeTo(expected[2], 0.00001)));

	assertThat(Arrays.stream(result).sum(), is(closeTo(1, 0.00001)));
}

abschließend

Vorerst konnte ich ein neuronales Netzwerk und eine Softmax-Funktion implementieren. Von hier an können Sie es selbst verstehen, aber Sie werden nicht verstehen können, was als Ganzes vor sich geht. Die Ausgabe entspricht dem Buch, Sie sollten also keinen Fehler machen.

Recommended Posts

[Deep Learning von Grund auf neu] in Java 3. Neuronales Netzwerk
Lernen Sie Deep Learning von Grund auf in Java.
Deep Learning Java von Grund auf neu Kapitel 3 Neuronales Netzwerk
Deep Learning Java von Grund auf 6.4 Regularisierung
Deep Learning Java von Grund auf neu Kapitel 1 Einführung
Deep Learning Java von Grund auf 6.1 Parameteraktualisierung
Deep Learning Java von Grund auf neu Kapitel 2 Perceptron
Deep Learning Java von Grund auf 6.3 Batch-Normalisierung
Deep Learning Java von Grund auf 6.2 Anfangswert des Gewichts
[Deep Learning von Grund auf neu] 2. In Java gibt es kein NumPy.
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Deep Learning Java von Grund auf neu Kapitel 5 Methode zur Fehlerrückübertragung
Erste Schritte für tiefes Lernen in Java
Schnellstes PC-Setup für tiefes Lernen von Grund auf
Java-Leben von vorne anfangen
Deep Copy Collection in Java
Objektorientiertes Kind !? Ich habe Deep Learning mit Java ausprobiert (Testversion)
Backpropagation Neural Network Java Code zum Lernen des XOR-Gate-Musters
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
[DL4J] Erstes Java Deep Learning (Handschriftliche Zeichenerkennung über ein vollständig verbundenes neuronales Netzwerk)
Lassen Sie uns auf Deep Java Library (DJL) eingehen, eine von AWS veröffentlichte Bibliothek, die Deep Learning in Java verarbeiten kann.
Java lernen (0)
Java Scratch Scratch
Rufen Sie Java-Methoden aus JavaScript auf, das in Java ausgeführt wird
OCR in Java (Zeichenerkennung aus Bildern)
Schlüssel vom Wert in Java Map umkehren
Abrufen des Verlaufs vom Zabbix-Server in Java
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Tauchen Sie ein in die Funktionsweise von HashMap in Java
Java-Methodenaufruf von RPG (Methodenaufruf in eigener Klasse)
Die Geschichte des Lernens von Java in der ersten Programmierung
So erhalten Sie eine Klasse von Element in Java
Textextraktion in Java aus PDF mit pdfbox-2.0.8
Erfassen und speichern Sie die Selen-Installation in Java
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java
[Java] KFunction von Method / Constructor in Java abrufen [Kotlin]
Java-Lerntag 5
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
FizzBuzz in Java
Java-Lerntag 2
Java-Lerntag 1
Versuchen Sie, synchronisierte Methoden aus mehreren Threads in Java aufzurufen
Erstellen Sie die VS Code + WSL + Java + Gradle-Umgebung von Grund auf neu
Löschen Sie alle aus dem Java SDK in Azure CosmosDB
[Persönliches Memo] Erstellen Sie eine einfache, tiefe Kopie mit Java
[Hinweis] Erstellen Sie mit Docker eine Java-Umgebung von Grund auf neu
Subtrahieren Sie Enum-Konstanten von Zeichenfolgen und Werten in Java zurück
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Schnell lernen Java "Einführung?" Teil 3 Von der Programmierung wegreden