Tensorflow中的张量是什么意思?

手机用户94816914260


tensorflow中的张量中用数学或物理的概念理解很抽象,很吃力。其实就从形式上理解能解决很多问题。形式上张量就是与数组相映射,可简单粗暴不准确理解成数组,在表达上为了计算机处理多维数组用嵌套列表表示。为了实现数学中张量计算的函数等,引入了形状这概念。所谓形状是反映张量有多少维,每个维度有多少个数。同时附带一下张量物理方面的举例。

0维张量 对应着物理中常量;\r

\r

1维张量 对应着物理中的矢量。\r

\r

2维张量 可用来表示物理中的应力。\r

\r

3维张量 可表示空间。可表示彩色图。图由RGB三个通道构成,通道用一个维度表示,每个通道要由两个维度表示图的高与宽。\r

\r

4维张量 可表示彩色图序列。图的序列由一个维度表示,图的通道用一个维度表示,图的高与宽各由一个维度表示。\r

\r

5维张量,可表示平面空间中的彩色图。平面的X Y轴,各由一个维度表示,图的通道 用一个维度表示,图的高与宽各由一个维度表示。\r

\r

6维张量,可表示空间中的彩色图。空间的XYZ轴各由一个维度表示,图的通道 用一个维度表示,图的高与宽各由一个维度表示。\r

\r

四维张量, 在图像识别中用得多。图像就占了三维(通道,宽与高),外加一次训练的图片数,共四维。四维张量python与空间形象表示举例:

[[1 2 3],[4 5 6]] 这种每行可边示宽,每列可表示高,整体表示通道,空间表示中每个有数字的面就代表通道,空间表示中每个立方体可表示一幅图,两个立方体序列可表示每次训练的图片数。这样表示好处是经过多次处理后,能方便解码还原成一组组图片




yunhaifeiwu


张量(tensor)这个词多出现于物理学,现在在人工智能领域也很常见,对于数学基础欠缺的人来说可能有点不明觉厉。

个人不太喜欢从物理学来理解这个概念,相反,我倾向于直接理解数学,直接用最代数化,最抽象化的方式去理解。这是我的一贯认知:越是直观的,越是肤浅和费解,越抽象越本质,也越好懂。

一旦数学上清楚了,就会发现物理也好,人工智能也好,只不过是一个小小的应用场景而已。

如果你打开一本“张量代数”的教材,这其实就是一本“线性代数”的升级版。实际上我觉得对初学者来说,先不要过多的陷入定义的细节,繁琐的公式,和诸多让人晕头转向的证明。

先搞清楚一点,在数学上,张量是干什么的?

张量,其实就是一个数学“量”,一种用来描述“几何体”的“数量”。同时,和最初等的自然数运算,稍高级的矩阵运算一样,“数”和“矩阵”既是“量”,也代表变换/关系/运算。实际上这几个概念是等价的。

比如自然数1,既是一个数,也代表+1这个运算(在抽象代数里可以称为“生成元”)。矩阵也一样,既可以代表一组坐标系“基组”,也可以代表基组之间的变换,二者是等价的。

张量也完全一样,它既可以表示一个“几何体”的量,也同时等价的代表不同张量之间的变换/关系。

抽象一点来看:定义张量需要一个“维度”(几何体的空间维度,比如3维空间,或在人工智能里常见的,几百万甚至几亿维),还需要一个“阶”数:

0阶张量就是一个标量

1阶张量就是该空间维度N的一个向量

2阶张量就是一个NxN矩阵

(高阶张量根本不用去找直观感受,那会把自己搞糊涂,和低阶一样,就是一个NxNxNxNxN…的“超矩阵”,代表的就是低阶张量之间的线性关系)

粗糙一点上说,高阶张量反映了低阶张量之间的某种超线性投影。

人工智能深度学习里处理视觉识别,常见的就是3阶张量。很容易理解,这种数学结构可以很好的表达输入和输出(当然中间可以有很多级)之间的关联性,是个很合适的数学工具。剩下就是纯数学的求解/优化问题了。

自然的,和四则运算,自然数,向量,矩阵一样,张量上可以也必须定义类似的运算,比如,和,积,点乘,叉乘,外积… 想怎么定义怎么定义,只要要数学意义即可。原则也都差不多,结合律,交换律或反交换律,运算封闭性,… 等等。

从数学本质来看,以下概念是一脉相承并且非常类似的:

自然数,整数,有理数,实数,复数,向量,矩阵,张量…


帖木兒


TensorFlow的tensor(张量)来自于数学上的张量概念。


(柯西应力张量,图片来源:维基百科)

什么是张量

19世纪末,Tullio Levi-Civita和Gregorio Ricci-Curbastro提出了张量,张量的提出是为了研究一些不依赖于坐标系的内在的几何性质和物理性质

。相对论出现以后,张量这个概念被发扬光大了(相对论需要研究不同参考系下的同一物理系统的规律)。在现代数学上,张量定义为多重线性映射(multilinear map)

不过以上其实都不重要。-_-!!!

实际上你需要记住的只有一点,在进行张量运算的时候,经常把张量当成多维数组进行计算。

张量和多维数组

没错,TensorFlow中的Tensor或者说张量就是多维数组

(我猜之所以叫TensorFlow,不叫ArrayFlow,是因为TensorFlow听起来比较高大上。)

举几个例子吧:

  1. 1是一个0维张量/0维数组,又叫标量(scalar),形状为[]。
  2. [1, 2, 3]是一个1维张量/1维数组,又叫向量(vector),形状为[3].
  3. [[1, 2, 3], [4, 5, 6]]是一个2维张量/2维数组,又叫矩阵(matrix),形状为[2, 3]。
  4. [[[1, 2, 3]], [[4, 5, 6]]]是一个3维张量/3维数组,有时候,张量特指3维以上的张量(低于3维的,如前所述,分别叫标量、向量、矩阵),形状为[2, 1, 3]。

论智


本人在华中科技大学CPSS实验室从事张量的云计算和大数据分析方向的有关工作。


以下理解需要基础的高等数学知识和线性代数的知识即可理解。

标量是0阶张量,向量是1阶张量,矩阵是2阶张量,三维以上的数组形式统称张量,N维数组cheng称为N阶张量。

采用张量对数据进行存储,能够保留数据的结构信息,但是张量的运算问题是非常困难的。我们知道,当数据的维度增加的时候,数据量会急剧增大,被称为维度灾难。想一下10的10次方的数据有多大,电脑的内存也有限,所以寻找可以降低数据量的近似方案成为重要的研究方向,这就是张量分解,也是我的研究方向。

我们回到问题,TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。

所以总结来说,你可简单的理解为高维数组,但是对应的计算和矩阵相比复杂了很多。


三杯酒两盏茶


张量(Tensor)这个词来最早自于物理。比如我们常见的标量(Scalar)如质量、温度等,只有尺度(Magnitude)而没有方向(Direction);向量(Vector)如重力、速度等,不仅有尺度大小还有一个方向。

而张量则是在标量和向量的基础之上做的进一步推广。比如柯西应力张量(Cauchy’s stress tensor),是一个描述物体表面压力的物理量。如下图所示:

在一个三维的坐标系中,我们可以用三维的向量来表示压力的大小和方向,与此同时我们还需要表示出压力作用的切平面,切平面同样可以用其法向量(垂直于切平面的向量)来表示出来。这种物理量就存在两个方向(力的方向和受力表面的方向),就是一个二阶的张量。实际上标量就是0阶张量,而向量则是一阶张量。


在数学中,我们用一个数字就可以表示出标量,如4、6;而对于向量则是用一维数组来表示,如(3,5,6);而对于二阶张量,则需要用二维方阵来表示。(注意:张量的维数和阶数是不同的概念,对于(3,5,6)来说是三维张量也是一阶张量)

而在Google发行的深度学习框架TensorFlow中,Tensor定义为n维数组(Array)的一种基本数据类型。这种数据类型包含两个特性:数据类型(float32、int32或者string等等)和形状大小。

比如一张黑白图片,就可以用二维数组(矩阵)来表示;而彩色图片则是用三维的数组来表示。



ICMLL实验室


先看字面翻译吧。tensor就是张量,flow流,tensorflow就是张量流。

那什么是张量呢?这个需要把标量、矢量、张量一起来说。比如,长度是标量(仅有大小),力是矢量(有大小,有方向),你可以将标量看作是没有方向的矢量。(特别说一下,面积在欧美教材上多被定义为矢量,国内课本多是作为标量。)而矢量是一阶张量,在tensorflow中是以矩阵展现数据的统称。

再说个例子吧,tersorflow中最基础的手写数字识别MNIST,就是将每一张手写数字图片展平成784维的张量,作为数据特征,保存图像的信息的。

至于流(flow),你没问我也先不回答了,你可以参考下面这张官网的张量流示意图(data flow graph),再深入体会一下。


分享到:


相關文章: