当前位置: 首页 > 工具软件 > ND4J > 使用案例 >

[DeepLearning4j学习日记]-ND4J矩阵的基本操作

秦焱
2023-12-01

什么是ND4J

官网上的介绍是这样介绍的

ND4J是Java编写的开源、分布式深度学习项目,由总部位于旧金山的商业智能和企业软件公司Skymind牵头开发。团队成员包括数据专家、深度学习专家、Java程序员和具有一定感知力的机器人。
 
通过科学计算,分析师能够从大数据中挖掘出价值。我们认为,业内对深入理解和挖掘数据之货币价值的旅程才刚刚起步。因此,我们决定在Java虚拟机(JVM)环境下运用科学计算。
 
官方API文档: http://nd4j.org/cn/getstarted

也就是说它是在java上进行 科学计算 的一个模块


环境搭建

最直接粗暴的方法就是直接克隆一个例程
以下链接含所有的DL4J的例程

https://github.com/eclipse/deeplearning4j-examples

直接克隆这个项目,基本所有的环境都搭建完成了
或者使用maven配置

<dependency>
    <groupId>org.nd4j</groupId>
    <artifactId>nd4j-native-platform</artifactId>
    <version>1.0.0-beta6</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7<</version>
</dependency>


矩阵的创建

创建一个全0的矩阵

创建一个全0的矩阵使用zeros方法

System.out.println("构造一个3行5列的全0 的ndarray");
INDArray zeros = Nd4j.zeros(3,5);
System.out.println(zeros);
System.out.println("===========================");

输出结果:

构造一个3行5列的全0 的ndarray
[[         0,         0,         0,         0,         0], 
 [         0,         0,         0,         0,         0], 
 [         0,         0,         0,         0,         0]]
===========================

创建一个全1的矩阵

创建一个全1的矩阵使用ones方法来创建

System.out.println("构造一个3行5列的全1 的ndarray");
INDArray ones = Nd4j.ones(3,5);
System.out.println(ones);
System.out.println("===========================");

他的输出结果如下:

构造一个3行5列的全1 的ndarray
[[    1.0000,    1.0000,    1.0000,    1.0000,    1.0000], 
 [    1.0000,    1.0000,    1.0000,    1.0000,    1.0000], 
 [    1.0000,    1.0000,    1.0000,    1.0000,    1.0000]]
===========================

创建一个随机矩阵

使用rand方法来创建一个随机矩阵

System.out.println("构造一个3行5列的随机 的ndarray");
INDArray rand = Nd4j.rand(3,5);
System.out.println(rand);
System.out.println("===========================");

输出结果:

构造一个3行5列的随机 的ndarray
[[    0.7856,    0.6902,    0.9957,    0.2112,    0.6514], 
 [    0.2687,    0.9486,    0.2844,    0.5083,    0.0264], 
 [    0.8163,    0.3329,    0.0089,    0.1918,    0.0853]]
===========================

创建一个随机高斯分布的矩阵

创建一个服从高斯分布的矩阵(平均值为0,标准差为1)需要调用randn方法

System.out.println("构造一个3行5列的随机 的ndarray 并且服从高斯分布(平均值为0,标准差为1)");
INDArray randn = Nd4j.randn(3,5);
System.out.println(randn);
System.out.println("===========================");

输出结果如下:

构造一个3行5列的随机 的ndarray 并且服从高斯分布(平均值为0,标准差为1)
[[   -1.0227,    1.1948,   -1.7703,   -0.6445,   -1.1990], 
 [   -1.7580,    0.9793,    1.7546,   -0.9343,   -0.8414], 
 [   -0.1830,    0.3517,    0.6258,   -0.7261,   -1.9069]]
===========================

根据数组来创建矩阵

根据数组来创建矩阵需要用create方法
第一个参数表示数据
第二个参数表示形状
(1,4)表示1行4列
(2,6)表示2行6列

System.out.println("====使用给定的数组来创建ndarray====");
//前面的表示数据,后面的表示形状
System.out.println("表示创建一个1行4列的 ndarray");
INDArray array1 = Nd4j.create(new float[]{2,2,2,2} ,new int[]{1,4});
System.out.println(array1);
System.out.println("表示创建一个3行3列的 ndarray");
INDArray array2 = Nd4j.create(new float[]{5,2,6,2,6,6,6,6,9},new int[]{3,3});
System.out.println(array2);
System.out.println("===========================");

输出结果:

====使用给定的数组来创建ndarray====
表示创建一个1行4列的 ndarray
[[    2.0000,    2.0000,    2.0000,    2.0000]]
表示创建一个3行3列的 ndarray
[[    5.0000,    2.0000,    6.0000], 
 [    2.0000,    6.0000,    6.0000], 
 [    6.0000,    6.0000,    9.0000]]
===========================

矩阵的修改

先来创建一个矩阵

INDArray nd = Nd4j.create(new float[]{1,2,3,4,5,6,7,8},new int[]{2,4});
System.out.println(nd);
/* 输出如下
 * [[    1.0000,    2.0000,    3.0000,    4.0000], 
 * [    5.0000,    6.0000,    7.0000,    8.0000]]
 */

然后我们对他进行取值

//获取第2行第4列的double值
double value = nd.getDouble(1, 3);
System.out.println("value = " + value);
/* value = 8.0 */

现在对矩阵的值进行修改

//吧第1行第4列的值改为100
nd.putScalar(0,3,100);
System.out.println(nd);
/*
 * [[    1.0000,    2.0000,    3.0000,  100.0000], 
 * [    5.0000,    6.0000,    7.0000,    8.0000]]
 */

获取矩阵的一行

//获取第2行的数据
INDArray row = nd.getRow(1);
System.out.println("row = " + row);
/* row = [    5.0000,    6.0000,    7.0000,    8.0000] */

替换矩阵的一行数据

//替换第2行的数据
INDArray row2 = Nd4j.create(new float[] {2,4,6,8});
nd.putRow(1,row2);
System.out.println(nd);
/*
 *[[    1.0000,    2.0000,    3.0000,  100.0000], 
 * [    2.0000,    4.0000,    6.0000,    8.0000]]
 */

矩阵的计算

首先创建4个矩阵

//1*2
INDArray nd1 = Nd4j.create(new float[]{2,2},new int[]{1,2});
//2*1
INDArray nd2 = Nd4j.create(new float[]{3,3},new int[]{2,1});
//2*2
INDArray nd3 = Nd4j.create(new float[]{3,3,3,3},new int[]{2,2});
//2*2
INDArray nd4 = Nd4j.create(new float[]{4,4,4,4},new int[]{2,2});

System.out.println("nd1 = " + nd1);
System.out.println("nd2 = " + nd2);
System.out.println("nd3 = " + nd3);
System.out.println("nd4 = " + nd4);

/*
=================================
nd1 = [[    2.0000,    2.0000]]
---------------------------------
nd2 = [[3.0000], 
       [3.0000]]
---------------------------------
nd3 = [[    3.0000,    3.0000], 
       [    3.0000,    3.0000]]
---------------------------------
nd4 = [[    4.0000,    4.0000], 
       [    4.0000,    4.0000]]
---------------------------------       
 */

矩阵加法

矩阵1[2,2] 加上 一个标量 6 = [8,8]

//给矩阵加上一个标量
INDArray add_num = nd1.add(6);
System.out.println(add_num);
/* [[    8.0000,    8.0000]] */

矩阵3 + 矩阵 4

//矩阵与矩阵相加
INDArray add_NDArray = nd3.add(nd4);
System.out.println(add_NDArray);
/*
[[    7.0000,    7.0000],
 [    7.0000,    7.0000]]
 */

矩阵减法

给矩阵减去一个标量

//给矩阵减去一个标量
INDArray sub_num = nd1.sub(6);
System.out.println(sub_num);
/* [[   -4.0000,   -4.0000]] */

矩阵减去一个矩阵

//矩阵减去一个矩阵
INDArray sub_NDArray = nd3.sub(nd4);
System.out.println(sub_NDArray);
/*
[[   -1.0000,   -1.0000], 
 [   -1.0000,   -1.0000]]
 */

矩阵乘法

矩阵1(1*2) 乘 矩阵2(2*1)

INDArray add = nd1.mmul(nd2);
System.out.println("add = " + add);
/* add = [[12.0000]] */

矩阵2(2*1) 乘 矩阵1(1*2)

INDArray add = nd2.mmul(nd1);
System.out.println("add = " + add);
/* add = [[    6.0000,    6.0000], 
          [    6.0000,    6.0000]] */

矩阵除法

INDArray div_num = nd1.div(2);
System.out.println(div_num);
/* [[    1.0000,    1.0000]] */

矩阵转置

INDArray transpose = nd2.transpose();
System.out.println(transpose);
/*
 nd2 = [[3.0000],
       [3.0000]]
       
 转置 = [[    3.0000,    3.0000]] */

一些其他的详细操作,请看

参考文档:
http://nd4j.org/cn/userguide#creating

 类似资料: