Deeplearning とか 人工知能とか

人工知能について勉強している理科大生

活性化関数

ディープラーニングで必須の活性化関数についてまとめます
リファレンスを見ていてSoftmax関数を探したんですが
見つからなくて。。。
どなたかわかる人教えてくださいorz

ReLU

max(0,x)

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.ops.transforms.Transforms;

INDArray matrixA = Nd4j.create(new float[]{-3,-2,-1,0,1,2,3,4},new int[]{1,8});
matrixA = Transforms.relu(matrixA);
System.out.println("matrixA\n"+matrixA);
出力
matrixA
[0.00, 0.00, 0.00, 0.00, 1.00, 2.00, 3.00, 4.00]

Softmax
出力層への各ノードへの入力に対して同じ個数の出力を計算する
ソフトマックス関数です
ライブラリの中に配列のソフトマックス関数が見当たらなかったので
合計を計算したのちに各成分に割り算を行うことにしました

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.ops.transforms.Transforms;

INDArray matrixA = Nd4j.create(new float[]{2,3,4,3,1,2,3,4},new int[]{1,8});
float sum = Transforms.exp(matrixA).sumNumber().floatValue();
matrixA = Transforms.exp(matrixA).div(sum);
System.out.println("Softmax:\n"+matrixA);

出力
Softmax:
[0.04, 0.11, 0.29, 0.11, 0.01, 0.04, 0.11, 0.29]

ND4J 行列の定義

m × n行列を定義したいとき Nd4j.createは一次元の行列を引数としますので それがどのような順番で行列に変換されるのか気になったので動かしてみました

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

        INDArray matrixA = Nd4j.create(new float[]{1,2,3,4,5,6,7,8},new int[]{2,4});
        System.out.println("matrixA:\n"+matrixA);

出力
matrixA:
[[1.00, 2.00, 3.00, 4.00],
 [5.00, 6.00, 7.00, 8.00]]

一次元配列は行列に 行方向に一番上からfillされていくようです

列方向の一番左からfillしていくためには

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

        INDArray matrixA = Nd4j.create(new float[]{1,2,3,4,5,6,7,8},new int[]{2,4},'f');
        System.out.println("matrixA:\n"+matrixA);

出力
matrixA:
[[1.00, 3.00, 5.00, 7.00],
 [2.00, 4.00, 6.00, 8.00]]

orderingの小文字'f'を引数にすると使えます

ND4J 行列計算

ND4Jの勉強をしている時に 同じ形をした行列の要素ごとの計算が必要になったので まとめてみようとおもいます INDArrayクラス Nd4jクラス

行列の要素毎の積

INDArray mul(INDArray);

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray matrixB = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray returnMatrix = matrixA.mul(matrixB);
System.out.println("returnMatrix:\n"+returnMatrix);


出力
returnMatrix:
[1.00, 4.00, 9.00, 16.00]

行列の要素毎の商(割り算)

INDArray div(INDArray);

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray matrixB = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray returnMatrix = matrixA.div(matrixB);
System.out.println("returnMatrix:\n"+returnMatrix);

出力
returnMatrix:
[1.00, 1.00, 1.00, 1.00]

行列の要素毎の和

INDArray addi(INDArray);

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray matrixB = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray returnMatrix = matrixA.addi(matrixB);
System.out.println("returnMatrix:\n"+returnMatrix);


出力
returnMatrix:
[2.00, 4.00, 6.00, 8.00]

行列の要素毎の差

INDArray sub(INDArray);

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray matrixA = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4});
INDArray matrixB = Nd4j.create(new float[]{1,2,3,4},new int[]{1,4}); INDArray returnMatrix = matrixA.sub(matrixB);
System.out.println("returnMatrix:\n"+returnMatrix);


出力
returnMatrix:
[0.00, 0.00, 0.00, 0.00]