Tensor

       Tensor是TensorFlow对矢量和矩阵的一种高维度的泛化。它与传统编程语言中的数据类型是有区别的,它更像是一种计算中使用的节点,只有在计算(运行)时,才会将数据流入。在TensorFlow中,Tensor使用tf.Tensor来定义,tf.Tensor有两个很重要的属性:数据类型(dtype, 例如 tf.float32tf.int32tf.string)和形状(shape,例如shape=(2,2))。

       tf.Tensor所包含的主要的Tensor有四种:tf.constanttf.Variabletf.placeholdertf.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.Variabletf.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]]

参考文档:

https://www.tensorflow.org/guide