张量是Tensorflow管理数据的形式。
1.张量的概念
在Tensorflow程序中,所有的数据都通过张量的形式来表示。
张量可以被简单的理解为多维数组。其中零阶张量表示标量,也就是一个数;第一阶张量为向量,也就是一个一维数组;第n阶张量可以理解为一个n维数组。
但是,张量在Tensorflow中的实现并不是直接采用数组的形式,它只是对Tensorflow中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。
eg:
从上面的代码可以看出Tensorflow中的张量和Numpy中的数组不同,Tensorflow计算的结果不是一个具体的数字,而是一个张量的结构。从上面代码的结果可以看出,一个张量中主要保存了三个属性:名字(name)、维度(shape)和类型(type)。
张量的第一个属性名字不仅是张量的唯一标识符,它同样也给出了这个张量是如何计算出来的。在《计算图》小节中介绍了Tensorflow的计算都可以通过计算图的模型来建立,而计算图上的每一个节点代表了一个计算,计算的结果就保存在张量中。所以张量和计算图上节点所代表的计算结果是对应的。这样张量的命名就可以通过“node:src_output”的形式来给出。其中node为节点的名称,src_output表示当前张量来自节点的第几个输出。比如:上面代码打印出来的“add:0”就说明了result这个张量是计算节点“add”输出的第一个结果(编号从0开始)。
张量的第二个属性是张量的维度(shape)。这个属性描述了一个张量的维度信息。比如上面样例中shape=(2,),说明了张量result是一个一维数组,这个数组的长度是2。
张量的第三个属性是类型(type),每一个张量会有一个唯一的类型。Tensorflow会对参与运算的所有张量进行类型的检查,当发现类型不匹配时会报错。
eg:
2.张量的使用
和Tensorflow的计算模型相比,Tensorflow的数据模型相对比较简单。张量使用主要可以总结为两大类。
第一类用途是对中间计算结果的引用。当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性。以下为使用张量和不使用张量记录中间结果来完成向量相加的功能的代码对比。
# 使用张量记录中间结果
a = tf.constant([1.0,2.0], name='a')
b = tf.constant([2.0,3.0], name='b')
result = tf.add(a, b , name = 'add')
# 直接计算向量的和,这样可读性会比较差
result = tf.constant([1.0,2.0], name='a') + tf.constant([2.0,3.0], name='b')
第二类用途是当计算图构造完成之后,张量可以用来获得计算结果,即得到真实的数字。虽然张量本身没有存储具体的数字,但是可以通过会话(session)得到具体的数字。比如上述代码中,可以使用tf.Session().run(result)语句来得到计算结果。