Tensor
Tensor
是TensorFlow对矢量和矩阵的一种高维度的泛化。它与传统编程语言中的数据类型是有区别的,它更像是一种计算中使用的节点,只有在计算(运行)时,才会将数据流入。在TensorFlow中,Tensor使用tf.Tensor
来定义,tf.Tensor
有两个很重要的属性:数据类型(dtype
, 例如 tf.float32
、tf.int32
或tf.string
)和形状(shape
,例如shape=(2,2)
)。
tf.Tensor
所包含的主要的Tensor
有四种:tf.constant
,tf.Variable
,tf.placeholder
与tf.SparseTensor
。在这四种变量中,只有tf.Variable
的值是可以改变的,因此在运行过程中只能使用tf.Variable
来表示中间结果。
tf.Tensor
的阶(Rank)表示了该对象的维度,而不同的阶表示的是不同的数学量,具体的含义如下表所示:
1. tf.constant
tf.constant
表示的是一个常量(张量),在定义时需要进行初始化(如下所示),在计算过程中它的值不能发生改变。要注意的是,它虽然表示的是常量,但只有在运行时才会给它赋初值。
c1 = tf.constant([1,2,3,4], shape=[2,2], dtype=tf.int32)
print(c1)
如下输出结果所示,如果直接进行输出,只会显示出该张量的一些属性信息。
Tensor("Const:0", shape=(2, 2), dtype=int32)
只有在运行时,才可以查看该张量的值,具体运行方法如下:首先定义一个会话sess,然后使用会话sess的run方法运行。
sess = tf.Session()
print(sess.run(c1))
最终的输出结果如下所示:
[[1 2]
[3 4]]
2. tf.Variable
tf.Variable
是一种变量(张量),它的值在运行过程中可以改变,因此模型参数的类型一般都为tf.Variable
。tf.Variable
的获取有两种方式:第一种是使用tf.Variable()
直接定义变量,需要在定义中指定变量的初值和变量所代表的数据类型(如,tf.float32, tf.int32);
v2 = tf.Variable(3.14, tf.float32)
print(v2)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(v2))
输出结果如下所示:
<tf.Variable 'Variable_1:0' shape=() dtype=float32_ref>
3.14
第二种方式是使用tf.get_variable()
来获取一个tf.Variable
变量,需要指定变量名,形状,类型,以及初始化相关的量。
v3 = tf.get_variable("v2", shape=[2,2,3], dtype=tf.int32, initializer=tf.zeros_initializer)
v4 = tf.get_variable("v4", dtype=tf.int32, initializer=tf.constant([3,5,7,9], shape=[2,2]))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(v3))
print(v4.eval(sess))
输出结果如下所示:
[[[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]]]
[[3 5]
[7 9]]
要注意的是,在使用tf.Variable
变量时,首先要使用初始化函数将tf.Variable
变量进行初始化。一种简单的方式如上所示,使用sess.run(tf.global_variables_initializer())
进行所有的tf.Variable
变量的初始化。
3. tf.placeholder
tf.placeholder
是一种可以在运行时指定初值的张量,如在训练一个模型时,可以使用tf.placeholder
类型的数据来动态的指定训练集。该类型的数据定义和初始化如下所示:首先定义一个tf.placeholder
量,指定其数据类型和形状;在运行时,通过一个feed_dict的参数来指定其初值。
p1 = tf.placeholder(tf.float32, shape=(2,2))
data1 = [[1,2], [3,4]]
sess = tf.Session()
print(sess.run(p1, feed_dict={p1: data1}))
输出结果如下所示:
[[1. 2.]
[3. 4.]]
4. tf.SparseTensor
tf.SparseTensor
是一种用来表示稀疏张量的类型,如果需要定义一个如下的张量,
[[1 0 0 0]
[0 0 2 0]
[0 0 0 0]]
则可以通过一个tf.SparseTensor
来表示。tf.SparseTensor
类型的张量是通过指定索引值所对应数值的方式来进行初始化的。如果要将该张量输出为一个完整的形式时,需要使用tf.sparse_tensor_to_dense()
来实现。
s = tf.SparseTensor(indices=[[0, 0], [1, 2]], values=[1, 2], dense_shape=[3, 4])
sess = tf.Session()
print("Sparse:")
print(sess.run(s))
print("Dense:")
print(sess.run(tf.sparse_tensor_to_dense(s)))
输出结果如下所示:
Sparse:
SparseTensorValue(indices=array([[0, 0],
[1, 2]], dtype=int64), values=array([1, 2]), dense_shape=array([3, 4], dtype=int64))
Dense:
[[1 0 0 0]
[0 0 2 0]
[0 0 0 0]]