> ## Content Index
> Fetch the complete content index at: https://yinguobing.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 深度学习框架TensorFlow
- URL: https://yinguobing.com/blog/deep-learning-framework-tensorflow/
- Published: 2017-10-26T02:51:27.000Z
- Updated: 2017-10-27T09:36:38.000Z
- Description: 深度学习框架TensorFlow的架构，以及使用TensorFlow的三种不同策略。
- Author: 尹国冰
- Tags: TensorFlow, 深度学习

# 深度学习在机器视觉领域的表现

ImageNet竞赛在机器视觉领域可谓家喻户晓。该竞赛需要使用计算机将143万多张图片分为1000类。是检验计算机图像算法的练兵场。2012年，多伦多大学的Alex Krizhevsky采用深度神经网络AlexNet在竞赛中将错误率降低了近36%，一举奠定了深度神经网络在机器视觉领域的基础地位。从此，深度神经网络的研究进入一轮爆发期，2015年Microsoft的MSRA的表现已经超越了人类的水平。

![tf01](https://yinguobing.com/blog/content/images/2017/10/tf01.jpg)

除了图像分类，深度学习还可以用在分辨率增强、物体检测、像素级的物体分割、风格迁移等方面，且呈现出超过以往常规方法的不凡表现。

![tf04](https://yinguobing.com/blog/content/images/2017/10/tf04.jpg)

![tf03](https://yinguobing.com/blog/content/images/2017/10/tf03.jpg)

![tf02](https://yinguobing.com/blog/content/images/2017/10/tf02.jpg)

虽然深度神经网络的本质并不复杂，但是若要用它来解决实际问题则需要做大量的工作。好在目前行业内已经有众多的框架可以选择。这些框架不仅仅提供基本的网络构建功能，有些还考虑了实际的网络训练与推理所依赖的分布式计算、数据预处理与后处理、对异构计算的支持、甚至是生产环境的部署。更加宝贵的是，这些框架都采用开源协议发布，为整个行业奠定了高水平的行业基础与开放的行业氛围。

![tf05](https://yinguobing.com/blog/content/images/2017/10/tf05.jpg)

# Caffe与TensorFlow

这些众多框架中，最为出名的当属Caffe与TensorFlow。

Caffe全称为Convolutional Architecture for Fast Feature Embedding，创始人为伯克利大学的Ph.D贾扬清。在TensorFlow出现之前是Github上深度学习领域star数最多的项目。以BSD 2-Clause协议发行。Caffe底层采用C++实现，在学术界与工业界获得广泛应用，尤其是在机器视觉领域。

TensorFlow最初是由Google机器智能研究部门的Google Brain团队中的研究人员和工程师开发的，用于进行机器学习和深度神经网络研究。目前在Github上的star数超过7万，是Caffe的3倍多。TensorFlow的开发最开始就是针对生产环境的，这使它非常适合应用在工业界。TensorFlow核心同样采用C++编写，具备较好的移植性。目前采用Apache License 2.0协议发行。

Caffe与TensorFlow都是非常适合工业界应用的深度学习框架。两者都有大量的用户与活跃的开发者社区。Caffe在学术界的接受度较高，因此对于学术研究来说是非常不错的选择。TensorFlow有着Google这样大型公司的背景，对于自身深度学习开发能力较弱，希望尽快引入深度学习应用的公司更具吸引力。

![tf06](https://yinguobing.com/blog/content/images/2017/10/tf06.jpg)

# 了解TensorFlow基本架构

TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点代表数学运算，而图中的边则代表在这些节点之间传递的多维数组（张量）。理论上只要可以将计算表示为计算图的形式，就可以使用TensorFlow。TensorFlow灵活的架构可使用一个API将计算工作部署到桌面设备、服务器或者移动设备中的一个或多个 CPU 或 GPU。

![tf07](https://yinguobing.com/blog/content/images/2017/10/tf07.jpg)

TensorFlow的基本架构如下图。对于采用TensorFlow进行开发的开发者来说，有三层应当格外关注。

## 第一层为Canned Estimators。

![tf08](https://yinguobing.com/blog/content/images/2017/10/tf08.jpg)

直译过来就是打包好的推演器。这一层提供了开箱即用的神经网络模型，免去了自行设计模型与训练模型的工作。缺点也很明显：训练好的模型只能完成预定义的工作，无法满足个性化的用户需求。

## 第二层为Estimator / Keras Model。

这一层提供了预定义好的神经网络模型架构，但是需要按照自己的需要去准备数据，进行训练与测试工作。

![tf09](https://yinguobing.com/blog/content/images/2017/10/tf09.jpg)

这样做的优点是对于不了解神经网络的开发者可以免去设计网络的工作，直接用自定义数据去训练即可得到所希望的结果。缺点是对于极度个性化的任务，很难找到一个合适的网络模型在运算量与实际表现之间取得一个平衡。

## 第三层为Layer层。

这一层提供了组成神经网络的基本结构Layer的自定功能，开发者可以按照自己的需求从Layer开始设计属于自己的神经网络。

![tf10](https://yinguobing.com/blog/content/images/2017/10/tf10.jpg)

Layer几乎是设计神经网络结构的底层单元了，再往下的基本单元为神经元。除非是学术研究，从Layer层开始设计已经能够满足设计一款完全自定义神经网络的需求。

# TensorFlow使用策略

TensorFlow在设计时就是面向生产环境的，它提供了组件TensorFlow Serving用来进行服务部署。并对外提供模型使用的接口。下图为TensorFlow Serving示意图。在它的帮助下，可以实现从训练模型、调试参数、打包模型到部署服务的完整应用。这种方式可以用在对外提供计算服务的领域，例如在线的人脸识别、图像识别、证件检测等服务。

![tf11](https://yinguobing.com/blog/content/images/2017/10/tf11.jpg)

除了对外提供计算服务的领域，TensorFlow也可以部署在嵌入式设备中，实现离线运行。目前在TensorFlow官方源代码中提供了一款Android手机的示例APP，展示了物体检测、分类与图像风格化的功能。由于神经网络模型的推演涉及大量的矩阵运算，给移动端设备带来了不小的运算压力。下图为运行在Google Pixel手机上的类Hololens手势检测DEMO，由本文作者供图。

![tf12](https://yinguobing.com/blog/content/images/2017/10/tf12.jpg)

面对计算压力，目前在移动端对神经网络的优化主要从两方面进行。一方面是算法与软件的优化，例如Google的MobileNet模型，在尽量保持性能的前提下通过改变网络结构，减少参数数量的方式降低运算量。另一方面则是从硬件着手，开发专门针对神经网络的ASIC。代表如华为麒麟970中的NPU，Apple X中的A11仿生芯片和高通Snapdragon 835中的DSP。  
![tf13](https://yinguobing.com/blog/content/images/2017/10/tf13.jpg)

![tf14](https://yinguobing.com/blog/content/images/2017/10/tf14.jpg)

![tf15](https://yinguobing.com/blog/content/images/2017/10/tf15.jpg)