DL4J中文文档/ND4J/张量

张量& ND4J

一个向量,即我们输入神经网络的数字列,一个更通用的数学结构的子类,称为张量。张量是多维数组。
你已经熟悉了由行和列组成的矩阵:行沿Y轴延伸,列沿X轴延伸。每个轴都是一个维度。张量有额外的维度。

张量也有一个所谓的rank:一个标量或单个数的rank为0;一个向量的rank为1;一个矩阵的rank为2;rank为3及以上的实体都简单地称为张量。

把标量看作一个点,把向量看作一条线,把矩阵看作一个平面,把张量看成三维或三维以上的物体,可能会有所帮助。矩阵有行和列,是二维的,因此rank为2。三维张量,例如我们用来表示彩色图像的张量,有通道、行和列,因此rank为3。

张量是一个具有多个维度的数学对象,它有一个形状,我们通过将张量视为N维数组来指定该形状。

使用ND4J,我们通过创建一个新的nd数组并将数据、形状和顺序作为其参数来实现这一点。在伪代码中,这将是

nd4j.createArray(data, shape, order)

真实的代码,这行为

INDArray arr = Nd4j.create(new float[]{1,2,3,4},new int[]{2,2},'c');

创建一个包含四个元素的数组,四个元素的形状是2乘2,其顺序是“行优先”或“行优先”,C为默认值。(相比之下,Fortran使用“列优先”顺序,并且可以用“f”作为第三个参数指定)。对于上面创建的数组,两个顺序之间的区别最好加以说明,表格如下:

Row-major (C) Column-major (Fortran)
[1,2] [1,3]
[3,4] [2,4]

一旦我们创建了一个N维数组,我们可能就需要处理它的切片。我们可以简单地“查看”多维切片,而不是复制数据,这个开销很大。数组“a”的切片可以这样定义:

a[0:5,3:4,6:7]

它将为你提供前5个通道,第3行到第4行,第6列到第7列,等等,用于n维度,每个维度的切片从冒号之前开始,在冒号之后结束。

线性缓冲器

Now, while it is useful to imagine matrices as two-dimensional planes, and 3-D tensors are cubic volumes, we store all tensors as a linear buffer. That is, they are all flattened to a row of numbers.

For that linear buffer, we specify something called stride. Stride tells the computation layer how to interpret the flattened representation. It is the number of elements you skip in the buffer to get to the next channel or row or column. There’s a stride for each dimension.

扫描二维码关注公众号,回复: 5080418 查看本文章

Here’s a brief video summarizing how tensors are converted into linear byte buffers for ND4J.

现在,虽然把矩阵想象成二维平面和三维张量是立方体积是很有用的,但是我们将所有张量存储为线性缓冲区。也就是说,它们都被展平成一行数字。
对于这个线性缓冲区,我们指定了一个叫做步幅(跨步)的东西。步幅告诉计算层如何解释扁平表示。它是你在缓冲区中跳过以到达下一个通道、行或列的元素数。每个维度都有一个跨步。
下面是一个简短的视频,总结了如何将张量转换为nd4j的线性字节缓冲区。

https://youtu.be/EHHtyRKQIJ0

其他资源和定义

张量这个词来源于拉丁语tendere,或“to stretch”;因此,张量与拉伸器有关。张量于1915年由德国引入英国,1898年由沃尔德马尔·沃伊特创造。数学对象被称为张量,因为这个概念的早期应用是拉伸材料的研究。

张量是标量(没有索引)、向量(只有一个索引)和矩阵(只有两个索引)到任意数量索引的推广。

张量:一种类似于向量但比向量更为通用的数学对象,由空间坐标函数的一组分量表示。

猜你喜欢

转载自blog.csdn.net/bewithme/article/details/86656234