1. tensor
tensor
可以被简单的理解为多维数组,但实际上,在tensorflow中,tensor
本身不会存储具体数值,它只是对运算结果的引用。
tensor
的另一个使用场景是当计算图构造完成之后,张量可以在会话中获得运算结果。
tensor
有三个属性,分别是name
、shape
以及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()
可以用来获取当前的计算图。graph
和tensor
还有op
的关系可以用下图来解释:
x
和y
分别是引用constant
的张量。add
是一个节点,输入正是x
和y
,输出z
,z
也是一个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是不同的数据类型