[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ü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();
}
}
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;
}
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;
}
Ich habe noch kein tiefes Lernen erreicht.
Recommended Posts