[Apprentissage profond à partir de zéro] 2. Il n'existe pas de NumPy en Java.

introduction

[Deep Learning from scratch in Java] 1. Différenciation et différenciation partielle pour le moment](https://qiita.com/xaatw0/items/edb111d4ca764c1976b0) C'est une continuation de. Bien sûr, NumPy n'est peut-être pas disponible en Java. Une bibliothèque Java similaire est ND4J, qui peut également utiliser GPU, mais je ne l'utilise pas car elle semble être le sujet principal. Et en Java, il existe des tableaux. Nous allons donc implémenter l'ajout et la multiplication du calcul de tableau. Soustrayez en ajoutant moins et divisez en divisant par 1 ~~ (découpage) ~~. Deep Learning, presque hors de propos.

Vérification du tableau bidimensionnel

Validez le tableau d'arguments à deux dimensions avant d'effectuer l'opération. Du point de vue, le nombre d'éléments n'est pas 0, et les longueurs des tableaux de seconde dimension (?) Sont toutes les mêmes.

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();
	}
}

Ajout d'un tableau bidimensionnel

Lors de l'ajout de nombres, ajoutez à tous les éléments du tableau à deux dimensions

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;
}

Lors de l'ajout d'un tableau à une dimension, la première dimension du tableau à deux dimensions est ajoutée au même élément

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;
}

Lors de l'ajout d'un tableau à une dimension, ajouter au même élément du tableau à deux dimensions

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;
}

Multiplier un tableau à deux dimensions

Lors de la multiplication par une valeur numérique, multipliez par tous les éléments du tableau à deux dimensions

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;
}

Lors de la multiplication d'un tableau à deux dimensions, multipliez ou ajoutez. Voir P54 "3.3.2 Matrix Inner Product" ou "■ Matrix Product AB Definition" à la page 54 du livre.

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;
}

en conclusion

Je n'ai pas encore atteint l'apprentissage profond.

Recommended Posts

[Apprentissage profond à partir de zéro] 2. Il n'existe pas de NumPy en Java.
Étudiez le Deep Learning à partir de zéro en Java.
[Deep Learning from scratch] dans Java 3. Réseau neuronal
Deep Learning Java from scratch 6.4 Régularisation
Deep Learning Java à partir de zéro Chapitre 1 Introduction
Deep Learning Java from scratch 6.1 Mise à jour des paramètres
Deep Learning Java à partir de zéro Chapitre 2 Perceptron
Deep Learning Java from scratch 6.3 Normalisation par lots
Deep Learning from scratch Java Chapter 4 Apprentissage des réseaux de neurones
Deep Learning Java à partir de zéro Chapitre 3 Réseau neuronal
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
Deep Learning Java from scratch 6.2 Valeur initiale du poids
Deep Learning Java from scratch Chapter 5 Méthode de propagation de retour d'erreur
Premiers pas pour l'apprentissage profond en Java
Configuration PC la plus rapide pour un apprentissage en profondeur à partir de zéro
Il ne semble pas y avoir d'autre-si en java
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Java11: exécuter le code Java dans un seul fichier tel quel
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
Pourquoi n'y a-t-il pas d'opérateur de décalage à droite non signé en C / C ++?
Enfant orienté objet!? J'ai essayé le Deep Learning avec Java (édition d'essai)
Voyons la Deep Java Library (DJL), une bibliothèque capable de gérer Deep Learning en Java, publiée par AWS.