TensorFlow是什么?
TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架。节点表示某种抽象的计算,边表示节点之间相互联系的张量。
TensorFlow支持各种异构的平台,支持多CPU/GPU,服务器,移动设备,具有良好的跨平台的特性;TensorFlow架构灵活,能够支持各种网络模型,具有良好的通用性;此外,TensorFlow架构具有良好的可扩展性,对OP的扩展支持,Kernel特化方面表现出众。
TensorFlow最初由Google大脑的研究员和工程师开发出来,用于机器学习和神经网络方面的研究,于2015.10宣布开源,在众多深度学习框架中脱颖而出,在Github上获得了最多的Star量。
前世今生:
诞生的大环境
• 15年9月发布0.1版本;17年2月发布1.0版本;19年3月发布2.0版本。
• 15年同类型框架:
• Ski-learn: Machine Learning, 不支持GPU;
• Caffe: 第一个面向深度学习的框架,但不支持自动求导;
• Keras: 只提供API接口;
• Torch: Lua语言;
• Teano: 开发调试难。
当下市场环境
• 当下同类型框架:
• Caffe: Facebook
• Caffe2: PyTorch(最新版本的Caffe2 作为PyTorch的C++后端已经并入到PyTorch里去)。
• Torch–PyTorch。PyTorch当下非常流行的框架,集合了Torch和Caffe2,Facebook主推。
• Teano: Google推出 Tensorflow1.0 ----Tensorflow2.0。
V1.0市场占有率
• 截止到TensorFlow1.1.3版本:
• Github中TensorFlow有大约121,372的store:
• PyTorch有25,181的store:
流行框架得分
系统概述
整个系统从底层到上层可分为七层:
1.最底层是硬件计算资源,支持CPU、GPU;
2.支持两种通信协议;
3.数值计算层提供最基础的计算,有线性计算、卷积计算;
4.数据的计算都是以数组的形式参与计算;
5.计算图层用来设计神经网络的结构;
6.工作流层提供轻量级的框架调用
7.最后构造的深度学习网络可以通过TensorBoard服务端可视化
技术架构
整体技术栈分为两部分:
1.前端系统:提供编程模型,负责构造计算图;
2.后端系统:提供运行时环境,负责执行计算图。
组件交互
master节点给两种类型的节点分发任务:
1./job:ps/task:0: 负责模型参数的存储和更新
2./job:worker/task:0: 负责模型的训练或推理
会话(Session)
客户端使用会话来和TF系统交互,一般的模式是,建立会话,此时会生成一张空图;在会话中添加节点和边,形成一张图,然后执行。
实现(Implementation)
1.TF中最重要的Tensor被支持的非常全面,8bit到64bit, signed和unsigned,IEEE float/double,complex number等等。使用引用计数来保存tensor,当计数到0时,tensor被回收。
2.客户端,用户会使用;与master和一些worker process交流
3.master,用来与客户端交互,同时调度任务;
4.worker process,工作节点,每个worker process可以访问一到多个device。
5.device,TF的计算核心,通过将device的类型、job名称、在worker process中的索引将device命名。可以通过注册机制来添加新的device实现,每个device实现需要负责内存分配和管理调度TF系统所下达的核运算需求。
跨设备�通信
当两个需要通信的op在不同的机器上时,就需要跨设备通信,当它们需要通信时,TF会在它们之间的联系中添加Send和Recv节点,通过Send和Recv之间进行通信来达到op之间通信的效果。如上所示。
梯度计算( Gradient Computation )
连接式的机器学习算法往往需要使用梯度下降法来求取参数,TF通过扩展图的方式实现了自动求导,TF做法如下:
对于每张计算图,得到从输入I到输出C的路径,并从C到I回溯,回溯过程中对于路径上的每个节点A,添加另一个节点来计算A’来计算偏导,在计算偏导的过程中,A’不仅仅将上一层传下来的反向导数作为输入,还可能将A的输入和输出也作为其输入。
数据并行计算( Data Parallel Training)
通过数据并行的方式来提升模型的效率,比如,假如每次模型的mini-batch是1000个样本,那么,切成10份,每份100个,然后将模型复制10份,每份都将梯度传到参数服务器上。
数据切分也分为同步和异步两种方式,同步的切分是等待每个独立的model传上来的梯度都到齐后再进行更新,这样和一个大的batch没有区别。异步的切分则是不用等待,每个独立的模型的参数更新直接更新。
模型并行训练( Model Parallel Training)
还可以对模型进行切分,让模型的不同部分执行在不同的设备上,这样可以一个迭代的样本可以在不同的设备上同时执行。如上图所示的LSTM模型
TensorFlow Lite:端侧机器学习框架
TensorFlow Lite(TFLite)是一个轻量、快速、跨平台的专门针对移动和IoT场景的开源机器学习框架,是TensorFlow的一部分,支持安卓、iOS、嵌入式Linux以及MCU等多个平台部署.
TensorFlow Quantum: 量子机器学习框架
TensorFlow Quantum(TFQ)是用于混合量子经典机器学习的 Python 框架,主要致力于建模量子数据。
该框架允许量子算法研究人员和机器学习研究人员探索将量子计算与机器学习结合在一起,训练量子模型。
TensorFlow Quantum 重点在于量子数据集和建立混合量子经典模型。它集成了许多量子算法和逻辑,并提供与现有 TensorFlow API 兼容的量子计算原函数,以及高性能量子电路模拟器。
目前,TensorFlow Quantum 主要面向在经典量子电路模拟器上执行量子电路。将来它能够在实际量子处理器上执行量子电路。
tensorflow项目应用
项目:Neural Style
这是最酷的TensorFlow GitHub项目之一。神经风格是将一张照片的风格迁移到另一张照片上的过程,同时保留相关的特张。简单的来说,通过这个项目,你可以使用TensorFlow创建自己的Prisma应用程序。
如上图所示,把梵高画作的风格,迁移到一张狮子的照片上,就得到一个星空风格的狮子照片,这就是所谓的风格迁移。下面再展示一组这个项目的风格迁移,能把这张狮子的照片,变成哪些非常有趣的效果。
这个项目在风格迁移的同时,还能对图像进行语义分割。进而实现对内容的前景、背景进行不同的风格迁移处理。这个过程如下图所示:
另外这个算法还能适用于视频处理。
上述图片处理使用的软硬件如下:
CPU: Intel Core i7-6800K@3.4GHz×12
GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
OS: Linux Ubuntu 16.04.1 LTS 64-bit
CUDA: 8.0
python: 2.7.12
tensorflow: 0.10.0rc
opencv: 2.4.9.1
GitHub地址如下:
https://github.com/cysmith/neural-style-tf
项目:Mozilla Deep Speech
这个GitHub项目使用TensorFlow将语音转换为文本。语音转文本是一个热门的机器学习领域,然而各地的人们有着不同的口音,这也是一个难以解决的问题。不过仍然可以通过深度学习实现非常不错的准确性。
其实这个项目,是一个基于百度DeepSpeech架构的TensorFlow实现。换句话说,这个项目是百度的内核,Google的外貌。
百度的相关论文地址在此:
https://arxiv.org/abs/1412.5567
DeepSpeech是吴恩达带领百度团队研发出的成果,最早发布于2014年底。今年初,百度基于DeepSpeech2,开发出一款名为SwiftScribe的应用(swiftscribe.ai),可以把语音文件更为快速、便捷的转换为文字。目前只限于英文。
回到这个项目。
所需软件环境如下:
Git Large File Storage
TensorFlow 1.0 or 1.1
SciPy
PyXDG
python_speech_features (nb: deprecated)
python sox
pandas
DeepSpeech native client libraries
如果你有至少8GB显存的英伟达GPU,强烈建议安装支持GPU的TensorFlow,因为使用GPU的训练比CPU快得多。
GitHub地址如下:
https://github.com/mozilla/DeepSpeech
项目:句子分类
句子分类就是识别句子类型的过程。例如,对于“食物非常糟糕”这个句子,你可能希望将其分类为正面句子或负面句子,这也被称为情绪分析。这个问题的难点在于:句子结构带来的复杂性。
利用卷积神经网络,我们可以尝试构建一个强大的文本分类器。
这里介绍的项目,是Yoon Kim论文《Convolutional Neural Networks for Sentence Classification(使用卷积神经网络进行句子分类)》的简单实现。这个论文的地址如下:
https://arxiv.org/abs/1408.5882
通过一个简单的CNN卷积神经网络,只进行很少的超参数调整和静态矢量,就可以得到出色的句子分类结果。
所需软件环境如下:
Python 3
Tensorflow > 0.12
Numpy
GitHub地址如下:
https://github.com/dennybritz/cnn-text-classification-tf
项目:图像分类/物体识别
图像分类,也就是训练系统识别猫猫狗狗,或者车道、海滩、天际线等场景。计算机视觉是一个范围巨大的领域,从面部识别到情感识别,甚至可以进行视觉气体泄漏检测。虽然实现流程各异,但底层系统是相通的。
所以作者创建了一个TensorFlow GitHub库,其中包括两个相互关联的部分。第一部分:能够识别1000个对象的TensorFlow图像分类器。第二部分:创建并训练一个全新的图像分类器。
我们先来看看第一部分,猫狗识别动态图。
Google的TensorFlow图像识别系统是目前最准确的图像分类软件。所谓图像识别,就是对图片中的内容进行识别,然而这并非对任意图片都能识别。
只有被训练过的对象,系统才能识别。例如,我们用三个类型训练分类器:猫、狗和牛。三个分类器只能识别相应类别中的一个。如果给出一张骆驼的图片会怎样?图片仍会通过一个分类器,但是置信率会非常的低。
项目:基于TensorFlow.js实现web版你画我猜
代码:https://github.com/zaidalyafeai/zaidalyafeai.github.io/tree/master/sketcher
Demo:https://zaidalyafeai.github.io/sketcher/
Google Colab notebook:https://colab.research.google.com/github/zaidalyafeai/zaidalyafeai.github.io/blob/master/sketcher/Sketcher.ipynb