TensorFlow是一个编程系统。
在TensorFlow中,使用图(graphs)来表示计算任务,图(graphs)中的节点称之为op(operation),一个op获得0个或者多个tensor,执行计算,产生0个或多个tensor,tensor看作是一个n维的数组或列表。图必须在会话(session)里启动运行。
先决条件:本机已安装TensorFlow环境。
请你参考:搭建Python机器学习环境
请参考如下命令,检查本机安装的TensorFlow环境。
cd anaconda3/bin
pwd
/Users/kevin/anaconda3/bin
source activate tensorflow
python
import tensorflow as tf
print (tf.__version__)
1.7.0
quit()
1. 张量
从TensorFlow的名字就可以看出张量(tensor)是一个很重的概念。在tensorflow程序中所有的数据都通过张量的形式来表示。从功能的角度看,张量可以被理解为多维数组。其中零阶张量表示标量(scalar)也就是一个数;一阶张量为向量,也就是一维数组;n阶张量可以理解为一个n维数组。但张量的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有保存数字,它保存的是如何得到这些数字的计算过程。
import tensorflow as tf
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')
print(result)
输出结果为:Tensor(“add:0”, shape=(2,), dtype=float32)。
从上面的代码可以看出TensorFlow中的张量和NumPy中的数组不同,TensorFlow计算的结果不是一个具体的数字,而是一个张量结构。从上面代码运行的结果可以看出,一个张量主要保存三个属性:名字(name)、维度(shape)和类型(type)。
张量的第一个属性名字不仅是一个张量的唯一标识符,它同样也给出出了这个张量是如何计算出来的。TensorFlow的计算可以通过计算图的模型来建立,而计算图上的每个节点代表了一个计算,计算的结果就保存在张量之中。所以张量和计算图上的节点所代表的计算结果是对应的。这样张量的命名就可以通过“node:str_output”的形式来给出。其中node为节点的名称,str_output表示当前张量来自节点的第几个输出。比如上面代码打出来的“add:0”就说明result这个张量是计算节点”add”输出的第一个结果(编号从零开始)。
张量的的第二个属性是张量的维度(shape)。这个属性描述了一个张量的维度信息。
张量的第三个属性是类型(type),每个张量会有唯一的类型。TensorFlow会对参与运算的所有张量进行类型检查,当发现类型不匹配时会报错。
2. 图
官网上对TensorFlow的介绍是:一个使用数据流图(data flow graphs)技术来进行数值计算的开源软件库。数据流图中的节点,代表数值运算;节点节点之间的边,代表多维数据(tensors)之间的某种联系。你可以在多种设备(含有CPU或GPU)上通过简单的API调用来使用该系统的功能。
数据流图是描述有向图中的数值计算过程。有向图中的节点通常代表数学运算,但也可以表示数据的输入、输出和读写等操作;有向图中的边表示节点之间的某种联系,它负责传输多维数据(Tensors)。图中这些tensors的flow也就是TensorFlow的命名来源。
节点可以被分配到多个计算设备上,可以异步和并行地执行操作。因为是有向图,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作。
TensorFlow程序中图的创建类似于一个施工阶段,而在执行阶段则利用一个session来执行图中的节点。很常见的情况是,在施工阶段创建一个图来表示和训练神经网络,而在执行阶段在图中重复执行一系列的训练操作。
接上面的代码,输入下入代码,可以看到图上的操作。
graph=tf.get_default_graph()
print(graph)
ops=graph.get_operations()
print(ops)
[, , ]
print(ops[0].node_def)
name: "a"
op: "Const"
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
attr {
key: "value"
value {
tensor {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 2
}
}
tensor_content: "\000\000\200?\000\000\000@"
}
}
}
3. 操作
操作(Operation)表示一种符号化的运算过程,是TensorFlow中的基本单元,即图中的节点。比如,一次加法是一个操作,一次乘法也是一个操作,构建一些变量的初始值也是一个操作。
操作的输入和输出都是张量(Tensor)。
如代码中的构建变量初始值(tf.Variable(3.0, name="X"))操作,add(加法)操作。
x=tf.Variable(3.0, name="X")
y=tf.Variable(6.0, name="Y")
z=tf.add(x,y,name='addXY')
4. 会话
会话(Session)是图(Graph)和执行者之间的媒介,是用来运行一个图用的。
构建好的计算图,必须通过Session来运行。
import tensorflow as tf
x=tf.constant(3.0, name="X")
y=tf.constant(6.0, name="Y")
z=tf.add(x,y,name="addXY")
with tf.Session() as sess:
result=sess.run(z)
print("x+y=%.0f" % result)
如果使用变量,则需要初始化变量,代码如下所示。
import tensorflow as tf
x=tf.Variable(3.0, name="X")
y=tf.Variable(6.0, name="Y")
z=tf.add(x,y,name="addXY")
init=tf.global_variables_initializer()
summary_writer=tf.summary.FileWriter("./calc_graph")
graph=tf.get_default_graph()
summary_writer.add_graph(graph)
summary_writer.flush()
with tf.Session() as sess:
sess.run(init)
result=sess.run(z)
print("x+y=%.0f" % result)
使用tensorboard --logdir=./calc_graph来展示图。
下篇文章,将介绍变量...
Kevin,2018年5月28日,于成都。