Tensorflow中的张量是什么意思?

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]。

张量(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等等)和形状大小。

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


深度学习中的所有数据张量的第一个轴都是样本轴,也称之为样本维度。另外,深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量,比如前面的案例就是每次取128个数据作为一个批量。

batch = train_images[:128]# nextbatch = train_images[128:256]# nth batch = train_images[128 * n: 128 * (n+1)]

在数字标号记住两个点:

从0开始

左闭右开

这是老外喜欢的调性。

在这个场景里,第一个轴称之为批量轴 batch axis或者也称之为批量维度 batch dimension。

这些术语对于构建整个理解知识体系很重要。

现实世界的数据张量描述

这里给出的几个例子,可以作为参考:

向量数据:2D张量,形状:(samples, features)时间序列数据:3D张量,形状:(samples, timesteps, features)图像:4D张量,形状为:(samples, height, width, channels)或者(samples, channels, height, width)

向量数据

每一条/行就是一个数据,第一个轴是样本轴,第二个轴是特征轴。一般的CSV数据都是这类。

时间序列或序列数据

这里给出的例子极好,以股票数据为例,每一分钟可以记录三个数据:

股票当前价格

前一分钟最高价

前一分钟最低价

所以每一分钟的数据可以编码为一个3D向量,注意这不是3D张量。一天下来,交易日有390分钟,可以得到一个2D张量,形状为(390,3)。一年250天则可以保存在一个形状为(250, 390,3)的3D张量中。一天的股票数据即为一个样本。

第一个轴是样本轴,第二个轴是时间轴,第三个轴是特征轴,这是约定的惯例。

图像数据

数字图像文件内容由两个部分组成:图像头信息和数据。

图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维数(dimension)。通过这三个参数即可以决定图像空间位置和规模。图像可以看做是空间中的一个规则网格,网格中的每个最小单元称之为一个像素(二维)或者体素(三维),这样网格在每个方向上的像素或者体素个数即为图像在该方向的维数。像素索引表示每个像素在图像网格中的位置,是图像内部的网格坐标。而在医学图像中,每个图像除了内部坐标外,还存在一个世界坐标。这个世界坐标依赖于成像设备。在医学图像中起点位置(Origin),像素间隔(space)和图像维数决定了世界坐标系。这样通过起点位置,像素间隔和像素索引即可计算每个像素的世界坐标位置。

图像数据即为图像像素的像素值,一般采用一维数组来表示和存储。已知像素索引和图像维数下,即可计算每个像素对应的像素值。通常图像的像素值为一个标量,例如一般灰度图像;图像像素值也可以是一个向量,例如彩色图像;另外图像像素值还可以是张量,如梯度场图像。医学图像处理中大部分的图像都是灰度图像。

这里需要注意灰度图像的灰度值的数据类型,在一般的灰度图像处理中不需要考虑,因为其范围默认为0-255,可以采用一个unsigned char类型来表示。但是在医学图像处理中,256灰度级远远不能满足要求,因此灰度范围往往大于256级。常见的医学图像的像素数据类型为unsigned short,灰度范围为0-65536。

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


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

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

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

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

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

张量是向量和矩阵的推广,可以理解为:零维张量是标量,一维张量是向量,二维张量是矩阵...

张量最早起源于齐次多项式的研究中,张量的概念是矩阵的延伸,张量的阶表示数据的维数,向量为一阶张量,矩阵为二阶张量,三维及以上数组为高阶张量。

以机械信号处理为例。在工程实际中采集的机械设备故障信号通常是不同激励源和多部件耦合振动的结果,具有典型的干扰大、非线性、非平稳等特征,且早期弱故障易被强背景噪声所淹没。此外,单一传感器获取的故障信息有限。因此,强噪声、多组分干扰下的弱故障特征提取以及多传感器联合诊断是当前故障诊断研究的热点问题。

信号复杂的动力学特性在重构的高维相空间中可以有效展示,作为矩阵表示的高维扩展,张量是高维数据最自然的表现形式。基于张量分解的信号处理方法能挖掘数据中潜在的特征信息,能够最大程度地保持数据的内在结构性质。

作为高维数据的模式分解方法,张量分解能挖掘数据中潜在的特征信息,并以低维子空间的形式储存在原始张量中,在一维以及多通道信号特征提取方面有明显的优势,被广泛的应用于子空间分割、信号分离、特征提取等领域。

相关代码参考