张量& 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维度,每个维度的切片从冒号之前开始,在冒号之后结束。
线性缓冲器
现在,虽然把矩阵想象成二维平面和三维张量是立方体积是很有用的,但是我们将所有张量存储为线性缓冲区。也就是说,它们都被展平成一行数字。
对于这个线性缓冲区,我们指定了一个叫做步幅(跨步)的东西。步幅告诉计算层如何解释扁平表示。它是你在缓冲区中跳过以到达下一个通道、行或列的元素数。每个维度都有一个跨步。
下面是一个简短的视频,总结了如何将张量转换为nd4j的线性字节缓冲区。
其他资源和定义
张量这个词来源于拉丁语tendere,或“to stretch”;因此,张量与拉伸器有关。张量于1915年由德国引入英国,1898年由沃尔德马尔·沃伊特创造。数学对象被称为张量,因为这个概念的早期应用是拉伸材料的研究。
张量是标量(没有索引)、向量(只有一个索引)和矩阵(只有两个索引)到任意数量索引的推广。
张量:一种类似于向量但比向量更为通用的数学对象,由空间坐标函数的一组分量表示。