神经网络最终的编程实现可能就是都是关于矩阵的操作,不仅仅局限于加减乘除。里面是基于ND4j实现的矩阵操作,这里我仅仅写了一些代码,还有其它很多的功能,感兴趣的可以自己找资料。
package org.deeplearning4j.examples.convolution;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
public class test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
INDArray v1 = Nd4j.create(new double[]{1,2,3});//创建一个矩阵
INDArray v2 = Nd4j.create(new double[]{4,5,6});
System.out.println(v1.distance2(v2));//计算欧式距离
System.out.println(v1.add(v2));//向量每一个元素相加
System.out.println(v1.add(1));//向量中每一个元素+1
System.out.println(v1.cumsum(0));//这个和matlab中的函数有些相似的地方,在Gibbs这种采样定律中经常使用
//比如[1,2,3]=>[1,1+2,1+2+3]
INDArray m = Nd4j.create(new double[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}); //创建矩阵
System.out.println(m);
System.out.println(m.transpose());//矩阵的转至
System.out.println(m.mul(2));//矩阵乘以一个数字
System.out.println(m.mul(m));//矩阵乘以矩阵(对应元素相乘)
System.out.println(m.mulColumnVector( Nd4j.create(new double[]{1,2,3,4}) ));//看结果吧,不知道如何描述
System.out.println(m.muliRowVector( Nd4j.create(new double[]{1,2,3,4})));
System.out.println(m.muliRowVector( Nd4j.create(new double[]{1,2,3,4})));
}
}
这里有个小问题,如果要是表示多维数组该如何表示哪?这个表示比较麻烦,但是也很重要。比如deeplerning4j对卷积层的操作就是采用这种方式:批处理样本数-通道数-宽度-长度四个维度的结构。具体如何实现的不打算现在研究,因为确实比较麻烦,我就是跟着debug一步一步走过来的,说句实话很不好用。。下面看看代码就知道意思了。
package John.John;
import java.util.ArrayList;
import java.util.List;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;
public class test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
INDArray m = Nd4j.create(new double[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}); //创建矩阵
List<INDArray> list = new ArrayList<INDArray>();
list.add(m);
System.out.println(m);
INDArray m3 = Nd4j.create(list, new int[] {1,1});//创建3维矩阵
System.out.println(m3);
List<INDArray> list2 = new ArrayList<INDArray>();
list2.add(m3);
INDArray m4 = Nd4j.create(list2, new int[] {1,1});//创建4维矩阵
System.out.println(m4);
}
}
这里面还有卷积的操作,但是我计算几次结果都是错的,也许是使用的方法不正确,但是这个真心难用。。