tensorflow中graph、tensor、op和session等基本概念

1. tensor

tensor可以被简单的理解为多维数组,但实际上,在tensorflow中,tensor本身不会存储具体数值,它只是对运算结果的引用。
tensor的另一个使用场景是当计算图构造完成之后,张量可以在会话中获得运算结果。
tensor有三个属性,分别是nameshape以及type

x1 = tf.constant(1.0, shape=[])       # 0D 标量 shape=()
x2 = tf.constant(1.0, shape=[1])      # 1D 一维向量 shape=(n,)
x3 = tf.constant(1.0, shape=[1,1])    # 2D 二维数组 shape=(m,n)
x4 = tf.random_normal(shape=(5, ))    # 1D 一维向量 shape=[5]
a1 = tf.nn.tanh(z1, name='output')    # 激活函数, 也是一个张量
print(x4)
============================================== output ==============================================
Tensor("random_num:0", shape=(5,), dtype=float32)

2. op

op也可以叫节点、操作或opreation,它的输入和输出都是tensor

train_step = optimizer.minimize(loss, name='train_step')
print(train_step)
============================================== output ==============================================
name: "train_step"
op: "NoOp"
input: "^train_step/update_w1/ApplyGradientDescent"
input: "^train_step/update_Variable/ApplyGradientDescent"
input: "^train_step/update_Variable_1/ApplyGradientDescent"
input: "^train_step/update_Variable_2/ApplyGradientDescent"

3. graph

Tensorflow的计算一般分为两个部分:第一阶段定义计算图中的所有计算,第二阶段执行计算,本文第4部分再介绍。
Tensorflow中的每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的关系。不同的计算图上的张量和运算都不会共享,tf.get_default_graph()可以用来获取当前的计算图。graphtensor还有op的关系可以用下图来解释:
tensorflow中graph、tensor、op和session等基本概念

  • xy分别是引用constant的张量。add是一个节点,输入正是xy,输出zz也是一个tensor,这整个结构就是一张graph

4. Session

Tensorflow使用Session来执行定义好的计算图。
高级用法后续补充,包括指定图、GPU/CPU等

5. 补充

5.1 常量和变量

常量定义后值和维度不可变,变量定义后值可变而维度不可变。相对于张量,变量的主要特性是可以保存,所以对于需要训练的参数,一般定义为变量。变量使用前一定要初始化:
sess.run(tf.global_variables_initializer())
变量、常量和张量打印出来如下:

a = tf.Variable(tf.random_normal([2]))
b = tf.constant([5.0,2.5])
c = tf.random_normal([2])
d = a+b+c
print(a,'\n',b,'\n',c,'\n',d)
============================================== output ==============================================
<tf.Variable 'Variable_10:0' shape=(2,) dtype=float32_ref> 
 Tensor("Const_5:0", shape=(2,), dtype=float32) 
 Tensor("random_normal_15:0", shape=(2,), dtype=float32) 
 Tensor("add_6:0", shape=(2,), dtype=float32)
  • 从上面的输出结果可以看出:常量就是张量、而张量和变量是可以直接结算的,只要dtype是一样的,注意tf.float64和tf.float32是不同的数据类型
;