请允许我引用官网上的这段话来介绍TensorFlow。
TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
TensorFlow的主要优点:
- 灵活性:支持底层数值计算,支持自定义操作符
- 可移植性:从服务器到PC到手机,从CPU到GPU到TPU
- 分布式计算:分布式并行计算,可指定操作符对应计算设备
一
HelloWorld简单范例
使用TensorFlow的基本步骤一般为:定义计算图,执行计算图,查看计算图(可选)。
代码语言:javascript复制import tensorflow as tf
#定义计算图
g = tf.Graph()
with g.as_default():
hello = tf.constant('hello',name = 'hello')
world = tf.constant('world',name = 'world')
helloworld = tf.string_join([hello,world],name = 'join',separator=' ')
#执行计算图
with tf.Session(graph = g) as sess:
print(sess.run(fetches = helloworld,feed_dict={}))
#查看计算图
with tf.summary.FileWriter('F:OneDrivemy_graph') as writer:
writer.add_graph(g)
#1,在命令行中切换到 F:/OneDrive
#2,运行 tensorboard --logdir='my_graph'
#3, 打开浏览器输入地址http://localhost:6006
二
张量数据结构
TensorFlow的数据结构是张量Tensor。Tensor即多维数组。Tensor和numpy中的ndarray很类似。
1,Tensor的维度 rank
标量为0维张量,向量为1维张量,矩阵为2维张量。
彩色图像有rgb三个通道,可以表示为3维张量。
视频还有时间维,可以表示为4维张量。
2,Tensor的形状 shape
Tensor在各个维度的长度可以用一个向量表示,称为Tensor的形状shape。
shape的元素数量和Tensor的维度相等。
3,Tensor的数据类型 dtype
Tensor的数据类型dtype和numpy中的array的数据类型dtype几乎一一对应。
不过Tensor中的字符串数据类型只能为np.string即字节byte类型,不能为"Unicode"
三
计算图算法语言
计算图由节点(nodes)和线(edges)组成。
节点表示操作符Operator,线表示计算间的依赖。
实线表示有数据传递依赖,传递的数据即张量。
虚线通常可以表示控制依赖,即执行先后顺序。
为什么TensorFlow要采用计算图来表达算法呢?
主要原因是计算图的编程模型能够让TensorFlow实现分布式并行计算。
下面我们来看一个简单的计算图的示例:计算 y = a*x^2 b*x c
并说明计算图和分布式并行计算之间的关联。
这个计算用纯Python语言,可能只要2到3行就能够实现。但表达成计算图,我们却要10多行代码。为啥TensorFlow还要用计算图来表达算法呢?当然计算图会非常直观,但主要原因是为了分布式并行计算。在纯Python语言的实现中我们只能由一个机器同时完成上述计算。计算顺序可能是这样的。
- step1:x_square = x^2
- step2:a_x_square = a*x^2
- step3: b_x = b*x
- step4:b_x_plus_c = b_x c
- step5:y = a_x_square b_x_plus_c
但实际上,step3,step4并不依赖于step1,step2。
按照如下顺序:step3-->step4-->step1-->step2-->step5来计算也是可以的。
实际上我们完全可以让step3,step4和step1,step2这两组计算同时由不同的机器进行。
表达成计算图后,计算之间的依赖和独立关系变得非常清晰。
TensorFlow可以将每个操作符Operator的任务分配给不同的机器,从而实现分布式并行计算。