一文解读Tensor究竟是个啥玩意儿?(附代码)

尽管理论上和实践中的张量(tensors)有一些细微差异,咱们仍然能给出这样的定义:一个张量就是一个能够容纳N维数据及其线性操做的容器。编程

机器学习中的数据一般须要处理为数值型的。特别地,当咱们特指神经网络中的数据表示时,一般会提到所谓的张量。一个张量就是一个能够容纳N维数据的容器。不少时候,人们会把它和matrix错误地混用(matrix特指2维的张量),张量是matrix在N维空间的通常形式。数组

数学上讲,张量不单单是一个数据容器,除了保存数值型数据,它也包括张量之间合法的线性变换。这种变换的例子如:叉积(cross product)和点积(dot product)。从计算机科学的角度看,把张量理解成面向对象中的对象而不是简单的一个数据结构会更有帮助。网络

(译者注:由于做者提到张量不只包含数据,并且包含相应的操做,这与咱们在面向对象编程中的约定是一致的,因此做者更建议理解成是对象。)数据结构

虽然上面的描述都是正确的,但理论上和机器学习实践中所指的张量仍是会有细微差异。咱们暂时简单地将他们视为数据结构,下图归纳了张量和标量、向量跟矩阵的关系,以及如何用Numpy建立各类数据类型的代码。在随后的帖子中咱们还会看看张量的变换。机器学习

1a3bd25a1bf5c6aa0bbd5dc30088fe82de9d2253

标量学习

单个数字就是一个标量。标量是一个0维的张量。所以,它具备0个轴,而且秩为0。spa

这就是细微差异出现的地方,尽管单个数字能够表示为张量,但并非说它就应该是张量或者一般是张量。咱们有足够的理由把数字视为张量(讨论张量的操做时会看到),但做为一种存储机制,这种表示会让人困惑。scala

下面的代码中,Numpy的多维数组ndarray被用来建立刚才讨论的示例结构。回忆一下,多维数组的ndim属性返回数组的维数。code

 

import numpy as np

x = np.array(42)

print(x)

print('A scalar is of rank %d' %(x.ndim))

42

A scalar is of rank 0

 

向量对象

向量是1维的张量,在计算机科学中常常把它叫作数组。向量由一串数字组成,具备1个轴,而且秩为1。

 

x = np.array([1, 1, 2, 3, 5, 8])

print(x)

print('A vector is of rank %d' %(x.ndim))

[1 1 2 3 5 8]

A vector is of rank 1

 

矩阵

矩阵是秩为2的张量,即它有两个轴。在各类场景你都能熟悉这个概念,尤为是把数据喂给你的scikit-learn机器学习模型时。矩阵就是把数字放入网格内(想象行和列),是一个2维的张量。

 

x = np.array([[1, 4, 7],

[2, 5, 8],

[3, 6, 9]])

print(x)

print('A matrix is of rank %d' %(x.ndim))

[[1 4 7]

[2 5 8]

[3 6 9]]

A matrix is of rank 2

 

三维张量(及更高的维度)

严格来讲,上述结构都是合法的张量。一般谈到张量时,都是将矩阵的概念推广到N>=3维。为了不混淆,咱们一般只把3维或更高维度的张量称为张量(一般而言,把标量‘42’称为张量没什么好处,只会让人困惑)。

相关文章
相关标签/搜索