3.2 TensorFlow主要特征
3.2.1 自动求微分
基于梯度的机器学习算法会受益于TensorFlow自动求微分的能力。在使用TensorFlow时,我们只需要定义预测模型的结构,将这个结构和目标函数(Objective Function)结合在一起,并添加数据,TensorFlow将自动为我们计算相关的微分导数。计算某个变量相对于其他变量的导数仅仅是通过扩展你的计算图来完成的,所以我们可以一直很清晰地看到系统中究竟在发生什么。
3.2.2 多语言支持
TensorFlow有一个合理的C++使用界面,也有一个易用的Python使用界面来构建和执行我们的计算图(Computation Graph)。我们可以直接编写Python/C++程序,也可以用交互式的iPython界面来调用TensorFlow以尝试一些想法,它可以帮我们将笔记、代码、可视化等有条理地归置好。当然这仅仅是一个起点,它同时也在促使我们创造自己最喜欢的语言界面,比如Go、Java、Lua、JavaScript、R等。
3.2.3 高度的灵活性
TensorFlow不是一个严格意义上的“神经网络”库。如果我们能够将计算表示为一个数据流图,那么就可以使用TensorFlow来构建图和描写驱动计算的内部循环。TensorFlow提供了有用的工具来帮助你组装“子图”(常用于神经网络),当然用户也可以自己在TensorFlow基础上编写自己的“上层库”。定义顺手好用的新复合操作和编写一个Python函数一样容易,而且也不用担心性能损耗。当然万一我们发现找不到想要的底层数据操作,我们也可以自己编写一点C++代码来丰富底层的操作。
3.2.4 真正的可移植性
TensorFlow在CPU和GPU上运行,比如说可以运行在台式机、服务器、移动设备等上面。在没有特殊硬件的前提下,TensorFlow能够帮我们在自己的笔记本上运行一下机器学习、深度学习模型。TensorFlow也可以帮助我们将自己的训练模型在多个CPU上进行规模化的运算,同时不必修改代码。TensorFlow还可以帮助我们将自己训练好的模型作为产品的一部分部署到手机App里。TensorFlow更可以帮助我们将自己的模型作为云端服务运行在自己的服务器上,或者运行在Docker容器里。
3.2.5 将科研和产品联系在一起
过去,要将科研中的机器学习想法用到产品中,需要大量的代码重写工作。现在,谷歌公司的科学家用TensorFlow尝试新的算法,产品团队则用TensorFlow来训练和使用计算模型,并直接提供给在线用户。使用TensorFlow可以让应用型研究者将想法迅速地运用到产品中,也可以让学术性研究者更直接地彼此分享代码,从而提高科研产出率。
3.2.6 性能最优化
例如,现在你有一个带有32个CPU内核、4个GPU显卡的工作站,就可以利用TensorFlow将工作站的计算潜能全部发挥出来。TensorFlow给予了线程、队列、异步操作等最佳的支持,能够让我们将自己手边硬件的计算潜能全部发挥出来。我们可以自由地将TensorFlow图中的计算元素分配到不同设备上,让TensorFlow帮我们管理好这些不同的副本。