[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.
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();
}
}
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;
}
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;
}
Je n'ai pas encore atteint l'apprentissage profond.