[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle

introduction

Il existe un livre intitulé "Deep Learning from scratch The Theory and Implementation of Deep Learning appris avec Python". Je l'ai lu deux fois, mais je pense le comprendre, je ne le comprends pas. Depuis qu'il est implémenté en Python en premier lieu, en tant que développeur Java, je pense qu'il a été dupé. En raison du typage dynamique, les arguments de la même méthode sont parfois des nombres et parfois des tableaux, en fonction de ce que l'appelant passe ... trop délicat ... ~~ Ce que vous devez apprendre sur Deeplearning4j docilement ~~ "Oui, implémentons-le en Java". Veuillez vous référer au livre pour l'explication car il est seulement implémenté.

Pour le moment, différenciation

Est-il possible d'implémenter la différenciation et le gradient en Java en premier lieu (P97 4.3 Différenciation numérique / P03 4.4 Gradient)? Si je ne peux pas le faire, je ne pense pas que cela va arriver, alors je l'ai essayé pour le moment (Java 8 ou plus récent).

ArrayUtil.java


private static double h = 1e-4; //Très petit nombre
public double numericalDiff(DoubleUnaryOperator func, double x){
	return (func.applyAsDouble(x + h) - func.applyAsDouble(x-h))/ (2*h);
}

Le contenu du test est P103. C'est comme le livre, donc c'est considéré comme bon.

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

Ensuite, différenciation partielle

Implémentation de la P104 du livre. ~~ Dans l'implémentation du livre (Python), la valeur d'origine est affectée à tmp_val, et après le calcul, elle est renvoyée à la valeur d'origine. Cependant, si vous le faites en Java, les données d'origine changeront après tout car la destination de référence est la même. Par conséquent, une copie complète est utilisée pour contenir les données d'origine. ~~ → J'ai reçu un commentaire disant qu'il n'y a pas de problème si je calcule immédiatement après la substitution. C'est raisonnable.

ArrayUtil.java


private static double h = 1e-4; //Très petit nombre
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;
}

Le contenu du test est P104. De même, il est considéré comme bon car il est conforme au livre.

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

en conclusion

La différenciation et la différenciation partielle semblent convenir. Au fait, je les ai tous mis en œuvre. Le problème est que le PC est lent et je ne peux pas vérifier s'il produit enfin des résultats corrects ouz

Recommended Posts

[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
É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
Premiers pas pour l'apprentissage profond en Java
Deep Learning Java à partir de zéro Chapitre 1 Introduction
Deep Learning Java from scratch 6.1 Mise à jour des paramètres
Apprendre pour la première fois java [Introduction]
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
Configuration PC la plus rapide pour un apprentissage en profondeur à partir de zéro
Utilisez une bibliothèque Java externe pour le moment
Deep Learning Java à partir de zéro Chapitre 3 Réseau neuronal
[Apprentissage profond à partir de zéro] 2. Il n'existe pas de NumPy en Java.
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
Mémo d'apprentissage lors de l'apprentissage de Java pour la première fois (mémo d'apprentissage personnel)
Deep Learning Java from scratch 6.2 Valeur initiale du poids
Entrez à partir de docker-compose pour le moment et apprenez Docker tout en apprenant la conception de base du serveur Web (Nginx) ①
Deep Learning Java from scratch Chapter 5 Méthode de propagation de retour d'erreur
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
Corrigez le code de caractère en Java et lisez à partir de l'URL
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
[DL4J] Premier apprentissage en profondeur Java (reconnaissance de caractères manuscrits à l'aide d'un réseau neuronal entièrement connecté)
[Enregistrement d'apprentissage] J'ai obtenu l'heure actuelle avec Ruby et j'ai sorti un message d'accueil différent à chaque fois.
Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
Introduction à Java pour la première fois # 2
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
[Communication Socket (Java)] Impressions de la mise en œuvre de la communication Socket dans la pratique pour la première fois
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Première programmation de ma vie Java 1st Hello World
[Java] Obtenez et affichez la date 10 jours plus tard à l'aide de l'API Time ajoutée à partir de Java 8.
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Analyser en Java les chaînes de date et d'heure formatées par la fonction asctime du langage C
Concernant les modificateurs transitoires et la sérialisation en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Java] Réglez l'heure depuis le navigateur avec jsoup
L'histoire de l'apprentissage de Java dans la première programmation
Ressentez le passage du temps même à Java
Capture et sauvegarde de l'installation de sélénium en Java
Installez Amazon Corretto (préversion) pour le moment
Pour l'apprentissage JAVA (2018-03-16-01)
Écrivez ABNF en Java et transmettez l'adresse e-mail
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Langage Java du point de vue de Kotlin et C #
Remarque sur l'initialisation des champs dans le didacticiel Java
Essayez d'exécuter Spring Cloud Config pour le moment
Classes et instances Java comprises dans la figure
Ceci et cela pour éditer ini en Java. : inieditor-java
Commande pour essayer d'utiliser Docker pour le moment
Stocker dans une carte Java 2D et tourner avec pour instruction
[Pour les débutants] Explication des classes, des instances et des statiques en Java
[Java] Rendre les variables de l'instruction for étendue et de chaque instruction immuables
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
Enfant orienté objet!? J'ai essayé le Deep Learning avec Java (édition d'essai)
Hello World avec la bibliothèque d'extension Ruby pour le moment