TensorFlow介绍

1. 简介

TensorFlow是谷歌2015年11月发布的开源人工智能系统,目前主要应用在语音识别、自动驾驶、图像识别等领域。这套框架在github上有开源代码,并且社区也有完善的文档及API。之前的软件算法都基于领域知识,给出既定的规则,程序负责对数据进行处理,得出相应的结果,但是人工智能的方式与此不同,采取的是基于统计学的基础上,结合领域知识提取合适的特性即可。TensorFlow的开源,标志着这种工作方式有了很多规范可以参考,并且工业界和社区共同完善这样的标准。

2.TensorFlow 介绍

什么是TensorFlow 

TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

什么是数据流图

数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

TensorFlow特征

1)高度灵活性

TensorFlow 不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用Tensorflow。你来构建图,描写驱动计算的内部循环。我们提供了有用的工具来帮助你组装“子图”(常用于神经网络),当然用户也可以自己在Tensorflow基础上写自己的“上层库”。定义顺手好用的新复合操作和写一个python函数一样容易,而且也不用担心性能损耗。当然万一你发现找不到想要的底层数据操作,你也可以自己写一点c++代码来丰富底层的操作。

2)真正的可移植性(Portability)

Tensorflow 在CPU和GPU上运行,比如说可以运行在台式机、服务器、手机移动设备等等。想要在没有特殊硬件的前提下,在你的笔记本上跑一下机器学习的新想法?Tensorflow可以办到这点。准备将你的训练模型在多个CPU上规模化运算,又不想修改代码?Tensorflow可以办到这点。想要将你的训练好的模型作为产品的一部分用到手机app里?Tensorflow可以办到这点。你改变主意了,想要将你的模型作为云端服务运行在自己的服务器上,或者运行在Docker容器里?Tensorfow也能办到。

3)将科研和产品联系在一起

过去如果要将科研中的机器学习想法用到产品中,需要大量的代码重写工作。那样的日子一去不复返了!在Google,科学家用Tensorflow尝试新的算法,产品团队则用Tensorflow来训练和使用计算模型,并直接提供给在线用户。使用Tensorflow可以让应用型研究者将想法迅速运用到产品中,也可以让学术性研究者更直接地彼此分享代码,从而提高科研产出率。

4)自动求微分

基于梯度的机器学习算法会受益于Tensorflow自动求微分的能力。作为Tensorflow用户,你只需要定义预测模型的结构,将这个结构和目标函数(objective function)结合在一起,并添加数据,Tensorflow将自动为你计算相关的微分导数。计算某个变量相对于其他变量的导数仅仅是通过扩展你的图来完成的,所以你能一直清楚看到究竟在发生什么。

5)多语言支持

Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/c++程序,也可以用交互式的ipython界面来用Tensorflow尝试些想法,它可以帮你将笔记、代码、可视化等有条理地归置好。当然这仅仅是个起点——我们希望能鼓励你创造自己最喜欢的语言界面,比如Go,Java,Lua,Javascript,或者是R。

6)性能最优化

比如说你又一个32个CPU内核、4个GPU显卡的工作站,想要将你工作站的计算潜能全发挥出来?由于Tensorflow 给予了线程、队列、异步操作等以最佳的支持,Tensorflow 让你可以将你手边硬件的计算潜能全部发挥出来。你可以自由地将Tensorflow图中的计算元素分配到不同设备上,Tensorflow可以帮你管理好这些不同副本。

TensorFlow的用户

任何人都可以用Tensorflow。学生、研究员、爱好者、极客、工程师、开发者、发明家、创业者等等都可以在Apache 2.0 开源协议下使用Tensorflow。Tensorflow 还没竣工,它需要被进一步扩展和上层建构。我们刚发布了源代码的最初版本,并且将持续完善它。我们希望大家通过直接向源代码贡献,或者提供反馈,来建立一个活跃的开源社区,以推动这个代码库的未来发展。

为何选择开源

如果Tensorflow这么好,为啥不藏起来而是要开源呢?答案或许比你想象的简单:我们认为机器学习是未来新产品和新技术的一个关键部分。在这一个领域的研究是全球性的,并且发展很快,却缺少一个标准化的工具。通过分享这个我们认为是世界上最好的机器学习工具库之一的东东,我们希望能够创造一个开放的标准,来促进交流研究想法和将机器学习算法产品化。Google的工程师们确实在用它来提供用户直接在用的产品和服务,而Google的研究团队也将在他们的许多科研文章中分享他们对Tensorflow的使用。

3.TensorFlow基本原理

TensorFlow 计算被抽象为包括若干节点的有向图。如下图所示例子:

这一点与Spark中的有向无环图比较类似,都是从一个方向演化出最终的结果。

在 TensorFlow 有向图中,每个节点表示运算符,可以有零个或多个输入,零个或多个输出。在有向图的普通棱边(从一个节点输出到另一个节点输入)流动的数值称为张量(Tensor),本质为任意维度数组。张量的元素数据类型可以显式指定或在构建有向图时推断得到。

下面是一些基本概念:

* 使用图 (graph) 来表示计算任务。
* 在被称之为 会话 (Session) 的上下文 (context) 中执行图。
* 使用 tensor 表示数据。
* 通过 变量 (Variable) 维护状态。
* 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据。

边(tensor)
每个 Tensor 是一个类型化的多维数组。例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].

节点(operation)
节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor.

图(graph)
节点(operation)和边(tensor)相互连接成图.一个 TensorFlow 图描述了计算的过程.

会话(session)
为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.

4.总结

推荐一些很好的学习资源:

1.TensorFlow入门

http://hacker.duanshishi.com/?p=1639

2.深入理解Neural Style

http://hacker.duanshishi.com/?p=1651

3.深入理解AlexNet

http://hacker.duanshishi.com/?p=1661

4.TensorFlow中文社区

http://www.tensorfly.cn/

5.TensorFlow上手教程

http://www.tensorfly.cn/tfdoc/get_started/os_setup.html



猜你喜欢

转载自blog.csdn.net/afandaafandaafanda/article/details/53954298