[Deep Learning von Grund auf neu] 2. In Java gibt es kein NumPy.

Einführung

[Deep Learning von Grund auf in Java] 1. Differenzierung und teilweise Differenzierung vorerst](https://qiita.com/xaatw0/items/edb111d4ca764c1976b0) Es ist eine Fortsetzung von. Natürlich ist NumPy in Java vielleicht nicht verfügbar. Eine ähnliche Java-Bibliothek ist ND4J, die auch GPU verwenden kann, aber ich verwende sie nicht, weil sie das Hauptthema zu sein scheint. Und in Java gibt es Arrays. Wir werden also die Addition und Multiplikation der Array-Berechnung implementieren. Subtrahieren Sie durch Hinzufügen von Minus und dividieren Sie durch Teilen durch 1 ~~ (Ausschneiden) ~~. Deep Learning, fast irrelevant.

Überprüfung des zweidimensionalen Arrays

Überprüfen Sie das zweidimensionale Array von Argumenten, bevor Sie die Operation ausführen. Aus der Sicht ist die Anzahl der Elemente nicht 0, und die Längen der zweitdimensionalen (?) Arrays sind alle gleich.

ArrayUtil.java


public void validate(double[][] x){

	if (x.length ==0 || x[0].length ==0){
		throw new IllegalArgumentException();
	}

	if (Arrays.stream(x).skip(1).anyMatch(p -> x[0].length != p.length)){
		throw new IllegalArgumentException();
	}
}

Hinzufügen eines zweidimensionalen Arrays

Fügen Sie beim Hinzufügen von Zahlen allen Elementen des zweidimensionalen Arrays hinzu

ArrayUtil.java


public double[][] plus(double[][] x, double y){
	validate(x);

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y;
		}
	}

	return result;
}

Beim Hinzufügen eines eindimensionalen Arrays wird die erste Dimension des zweidimensionalen Arrays demselben Element hinzugefügt

ArrayUtil.java


public double[][] plus(double[][] x, double[] y){
	validate(x);

	if (x[0].length != y.length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y[j];
		}
	}

	return result;
}

Fügen Sie beim Hinzufügen eines eindimensionalen Arrays dasselbe Element des zweidimensionalen Arrays hinzu

ArrayUtil.java


public double[][] plus(double[][] x, double[][] y){
	validate(x);
	validate(y);

	if (x.length != y.length || x[0].length != y[0].length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y[i][j];
		}
	}

	return result;
}

Multiplizieren eines zweidimensionalen Arrays

Wenn Sie mit einem numerischen Wert multiplizieren, multiplizieren Sie mit allen Elementen des zweidimensionalen Arrays

ArrayUtil.java


public double[][] multi(double[][] x, double y){
	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[i].length; j++){
			result[i][j] = x[i][j] * y;
		}
	}

	return result;
}

Wenn Sie ein zweidimensionales Array multiplizieren, multiplizieren oder addieren Sie es. Siehe P54 "3.3.2 Matrix Inneres Produkt" oder "■ Matrixprodukt AB Definition" auf Seite 54 des Buches.

ArrayUtil.java


public double[][] multi(double[][] x, double[][] y){

	validate(x);
	validate(y);

	int cntCalc = x[0].length;
	if (cntCalc != y.length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = y[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			final int row = i;
			final int col = j;
			result[row][col] = IntStream.range(0, cntCalc).mapToDouble(k -> x[row][k] * y[k][col]).sum();
		}
	}

	return result;
}

abschließend

Ich habe noch kein tiefes Lernen erreicht.

Recommended Posts

[Deep Learning von Grund auf neu] 2. In Java gibt es kein NumPy.
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
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 von Grund auf neu Java Kapitel 4 Lernen neuronaler Netze
Deep Learning Java von Grund auf neu Kapitel 3 Neuronales Netzwerk
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Deep Learning Java von Grund auf 6.2 Anfangswert des Gewichts
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
Es scheint kein anderes zu geben - wenn in Java
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
Warum gibt es in C / C ++ keinen vorzeichenlosen Rechtsverschiebungsoperator?
Objektorientiertes Kind !? Ich habe Deep Learning mit Java ausprobiert (Testversion)
Lassen Sie uns auf Deep Java Library (DJL) eingehen, eine von AWS veröffentlichte Bibliothek, die Deep Learning in Java verarbeiten kann.