## 1. TensorFlow 基础知识
在本章中,我将简要介绍 TensorFlow 的代码及其编程模型。在本章的最后,读者可以在他们的个人计算机上安装 TensorFlow 软件包。
### 开源软件包
学术界已经对机器学习进行了数十年的调查,但直到近几年,它的渗透率在企业中也有所增加。这要归功于它已经拥有的大量数据以及现在可用的前所未有的计算能力。
在这种情况下,毫无疑问,在 Alphabet 的支持下,谷歌是机器学习技术在其所有虚拟计划和产品中发挥关键作用的最大公司之一。
去年10月,当 Alphabet 宣布那个季度谷歌的业绩,销售额和利润大幅增加时,首席执行官桑达皮采清楚地说:“机器学习是一种核心的,变革性的方式,我们正在重新思考我们正在做的一切”。
从技术上讲,我们正面临着谷歌不是唯一一个重要角色的时代变迁。其他技术公司,如微软,Facebook,亚马逊和苹果等众多公司也在增加对这些领域的投资。
在此背景下,几个月前谷歌在开源许可证(Apache 2.0)下发布了 TensorFlow 引擎。想要将机器学习纳入其项目和产品的开发人员和研究人员可以使用 TensorFlow,就像 Google 在内部使用 Gmail,Google 照片,搜索,语音识别等不同的商业产品一样。
TensorFlow 最初是由 Google Brain Team 开发的,目的是进行机器学习和深度神经网络研究,但该系统足以应用于各种其他机器学习问题。
由于我是一名工程师,而且我正在与工程师交谈,因此本书将深入了解数据流图如何表示算法。TensorFlow 可以看作是使用数据流图进行数值计算的库。图中的节点表示数学运算,而图的边表示多维数据数组(张量),它们将节点互连。
TensorFlow 围绕构建和操作计算图的基本思想构建,象征性地表示要执行的数值运算。这使得 TensorFlow 现在可以从 Linux 64 位平台(如 Mac OS X)以及 Android 或 iOS 等移动平台中利用 CPU 和 GPU。
这个新软件包的另一个优点是它的可视 TensorBoard 模块,它提供了大量有关如何监视和显示算法运行的信息。在创建更好的模型的过程中,能够测量和显示算法的行为是非常重要的。我感觉目前许多模型都是通过一个小型的盲目过程,通过试错来调优,明显浪费资源,以及最重要时间。
### TensorFlow 服务
最近 Google 推出了 TensorFlow 服务 [3],这有助于开发人员将他们的 TensorFlow 机器学习模型(即使如此,也可以扩展来服务其他类型的模型)投入生产。TensorFlow 服务是一个开源服务系统(用 C++ 编写),现在可以在 Apache 2.0 许可下[在 GitHub ](http://tensorflow.github.io/serving/)上获得。
TensorFlow 和 TensorFlow 服务有什么区别? 在 TensorFlow 中,开发人员更容易构建机器学习算法,并针对某些类型的数据输入进行训练,TensorFlow 服务专门使这些模型可用于生产环境。我们的想法是开发人员使用 TensorFlow 训练他们的模型,然后他们使用 TensorFlow 服务的 API 来响应来自客户端的输入。
这允许开发人员根据实际数据大规模试验不同的模型,并随时间变化,保持稳定的架构和 API。
典型的流水线是将训练数据提供给学习器,学习器输出模型,模型在被验证之后准备好部署到 TensorFlow 服务系统。 随着时间的推移和新数据的出现,改进模型,启动和迭代我们的模型是很常见的。事实上,在 Google 的博文中 [4] 中,他们提到在谷歌,许多流水线都在持续运行,随着新数据的出现,产生了新的模型版本。
![TensorFlowServing](https://jorditorres.org/wp-content/uploads/2016/04/TensorFlowServing.png)
开发人员用来与 TensorFlow 服务进行通信的前端实现,基于 [gRPC](http://www.grpc.io/) ,这是一种来自 Google 的高性能开源RPC框架。
如果你有兴趣了解 TensorFlow 服务的更多信息,我建议你先阅读服务架构概述 [5] 部分,设置你的环境并开始阅读基础教程 [6]。
### TensorFlow 的安装
是时候做一些事情了。从现在开始,我建议你交替阅读和在计算机上练习。
TensorFlow 有 Python API(以及 C/C++),需要安装 Python 2.7(我假设任何阅读本书的工程师都知道如何操作)。
通常,在使用 Python 时,应使用虚拟环境`virtualenv`。 `virtualenv`是一种工具,用于在同一台计算机的不同部分中保持不同项目所需的 Python 依赖关系。如果我们使用`virtualenv`来安装 TensorFlow,这将不会覆盖需要 TensorFlow 的其他项目的现有 Python 包版本。
首先,如果尚未安装`pip`和`virtualenv`,则应安装,如下面的脚本所示:
```
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev python-virtualenv
# Mac OS X
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv
```
`~/tensorflow`目录中的环境`virtualenv`:
`$ virtualenv --system-site-packages ~/tensorflow`
下一步是激活`virtualenv`。这可以按如下方式完成:
```
$ source ~/tensorflow/bin/activate # with bash
$ source ~/tensorflow/bin/activate.csh # with csh
(tensorflow)$
```
我们工作的虚拟环境的名称,将从现在开始显示在每个命令行的开头。激活`virtualenv`后,你可以使用`pip`在其中安装 TensorFlow:
```
# Ubuntu/Linux 64-bit, CPU only:
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# Mac OS X, CPU only:
(tensorflow)$ sudo easy_install --upgrade six
(tensorflow)$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl
```
我建议你访问此处提供的官方文档,来确保你安装的是最新版本。
如果运行代码的平台具有 GPU,要使用的包不同。我建议你访问官方文档,了解你的 GPU 是否符合支持 Tensorflow 所需的规范。运行 Tensorflow GPU 需要安装其他软件,所有信息都可以在下载和设置 TensorFlow [7] 网页上找到。对于使用 GPU 的更多信息,我建议阅读第 6 章。
最后,当你完成后,你应该按如下方式禁用虚拟环境:
```
(tensorflow)$ deactivate
```
鉴于本书的介绍性质,我们建议读者访问上述官方文档页面,来查找安装 Tensorflow 的其他方法的更多信息。
### 我在 TensorFlow 中的第一个代码
正如我在开始时提到的那样,我们将通过很少的理论和大量练习来探索 TensorFlow 星球。开始吧!
从现在开始,最好使用任何文本编辑器编写 python 代码并使用扩展名`.py`保存(例如`test.py`)。要运行代码,使用命令`python test.py`就足够了。
为了获得 TensorFlow 程序的第一印象,我建议编写一个简单的乘法程序;代码看起来像这样:
```py
import tensorflow as tf
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.mul(a, b)
sess = tf.Session()
print sess.run(y, feed_dict={a: 3, b: 3})
```
在此代码中,在导入 Python 模块`tensorflow`之后,我们定义“符号”变量,称为占位符,以便在程序执行期间操作它们。然后,我们将这些变量作为参数,调用 TensorFlow 提供的乘法函数。`tf.mul`是 TensorFlow 为操纵张量而提供的众多数学运算之一。在这个时候,张量可以认为是动态大小的多维数据数组。
主要运算如下表所示:
| 运算 | 描述 |
| --- | --- |
| `tf.add` | 加法 |
| `tf.sub` | 减法 |
| `tf.mul` | 乘法 |
| `tf.div` | 除法 |
| `tf.mod` | 模 |
| `tf.abs` | 返回绝对值 |
| `tf.neg` | 返回负值 |
| `tf.sign` | 返回标志 |
| `tf.inv` | 返回倒数 |
| `tf.square` | 计算平方 |
| `tf.round` | 返回最接近的整数 |
| `tf.sqrt` | 计算平方根 |
| `tf.pow` | 计算指数 |
| `tf.exp` | 计算自然指数 |
| `tf.log` | 计算自然对数 |
| `tf.maximum` | 返回最大值 |
| `tf.minimum` | 返回最小值 |
| `tf.cos` | 计算余弦 |
| `tf.sin` | 计算正弦 |
TensorFlow 还为程序员提供了许多函数,来对矩阵执行数学运算。一些列在下面:
| 运算 | 描述 |
| --- | --- |
| `tf.diag` | 返回具有给定对角线值的对角张量 |
| `tf.transpose` | 返回参数的转置 |
| `tf.matmul` | 返回由参数列出的两个张量的张量积 |
| `tf.matrix_determinant` | 返回由参数指定的方阵的行列式 |
| `tf.matrix_inverse` | 返回由参数指定的方阵的逆 |
下一步,最重要的一步是创建一个会话来求解指定的符号表达式。实际上,到目前为止,这个 TensorFlow 代码尚未执行任何操作。我要强调的是,TensorFlow 既是表达机器学习算法的接口,又是运行它们的实现,这是一个很好的例子。
程序通过使用`Session()`创建会话来与 Tensorflow 库交互;只有在我们调用`run()`方法时才会创建这个会话,这就是它真正开始运行指定代码的时候。在此特定示例中,使用`feed_dict`参数将变量的值传给`run()`方法。这里,相关代码求解表达式,并且从显示器返回 9 作为结果。
通过这个简单的例子,我试图介绍在 TensorFlow 中编程的常规方法,首先指定整个问题,并最终创建一个可以运行相关计算的会话。
然而,有时我们感兴趣的是构造代码的更多的灵活性,插入操作来构建某个图,这些操作运行它的一部分。例如,当我们使用 Python 的交互式环境时,例如 IPython [8],就会发生这种情况。为此,TesorFlow 提供了`tf.InteractiveSession()`类。
这种编程模型的动机超出了本书的范围。但是,为了继续下一章,我们只需要知道所有信息都在内部保存在图结构中,它包含所有操作和数据的信息。
该图描述了数学运算。节点通常实现数学运算,但它们也可以表示数据输入,输出结果或读/写持久变量。边描述节点与其输入和输出之间的关系,同时携带张量,即 TensorFlow 的基本数据结构。
将信息表示为图允许 TensorFlow 知道事务之间的依赖关系,并异步并行地将操作分配给设备,当这些操作已经具有可用的相关张量(在边缘输入中指示)时。
因此,并行性是使我们能够加速一些计算昂贵的算法的执行的因素之一,但也因为 TensorFlow 已经有效地实现了一组复杂的操作。此外,大多数这些操作都具有关联的内核,这些内核是为特定设备(如 GPU)设计的操作的实现。下表总结了最重要的操作/内核 [9]:
| 操作组 | 操作 |
| --- | --- |
| 数学 | 加,减,乘,除,指数,对数,大于,小于,等于 |
| 排列 | 连接,切片,分割,常数,阶,形状,打乱 |
| 矩阵 | MatMul,MatrixInverse,MatrixDeterminant |
| 神经网络 | SoftMax,Sigmoid,ReLU,Convolution2D,MaxPool |
| 检查点 | 保存,还原 |
| 队列和同步 | Enqueue,Dequeue,MutexAcquire,MutexRelease |
| 流量控制 | 合并,切换,进入,离开,NextIteration |
### 显示面板 Tensorboard
为了使其更加全面,TensorFlow 包含了名为 TensorBoard 的可视化工具来调试和优化程序的功能。TensorBoard 可以以图形方式查看计算图任何部分的参数和细节的不同类型的统计信息。
TensorBoard 模块显示的数据在 TensorFlow 执行期间生成,并存储在跟踪文件中,其数据来自摘要操作。在 TensorFlow 的文档页面 [10] 中,你可以找到 Python API 的详细说明。
我们调用它的方式非常简单:从命令行中使用 Tensorflow 命令启动服务,它包含要跟踪的文件作为参数。
```
(tensorflow)$ tensorboard --logdir=
```
你只需要使用`http//localhost:6006 /`从浏览器中 [11] 访问本地套接字 6006。
名为 TensorBoard 的可视化工具超出了本书的范围。对于 Tensorboard 如何工作的更多详细信息,读者可以访问 TensorFlow 教程页面中的 TensorBoard 图形可视化 [12] 部分。
- TensorFlow 1.x 深度学习秘籍
- 零、前言
- 一、TensorFlow 简介
- 二、回归
- 三、神经网络:感知器
- 四、卷积神经网络
- 五、高级卷积神经网络
- 六、循环神经网络
- 七、无监督学习
- 八、自编码器
- 九、强化学习
- 十、移动计算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度学习
- 十三、AutoML 和学习如何学习(元学习)
- 十四、TensorFlow 处理单元
- 使用 TensorFlow 构建机器学习项目中文版
- 一、探索和转换数据
- 二、聚类
- 三、线性回归
- 四、逻辑回归
- 五、简单的前馈神经网络
- 六、卷积神经网络
- 七、循环神经网络和 LSTM
- 八、深度神经网络
- 九、大规模运行模型 -- GPU 和服务
- 十、库安装和其他提示
- TensorFlow 深度学习中文第二版
- 一、人工神经网络
- 二、TensorFlow v1.6 的新功能是什么?
- 三、实现前馈神经网络
- 四、CNN 实战
- 五、使用 TensorFlow 实现自编码器
- 六、RNN 和梯度消失或爆炸问题
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用协同过滤的电影推荐
- 十、OpenAI Gym
- TensorFlow 深度学习实战指南中文版
- 一、入门
- 二、深度神经网络
- 三、卷积神经网络
- 四、循环神经网络介绍
- 五、总结
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高级库
- 三、Keras 101
- 四、TensorFlow 中的经典机器学习
- 五、TensorFlow 和 Keras 中的神经网络和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于时间序列数据的 RNN
- 八、TensorFlow 和 Keras 中的用于文本数据的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自编码器
- 十一、TF 服务:生产中的 TensorFlow 模型
- 十二、迁移学习和预训练模型
- 十三、深度强化学习
- 十四、生成对抗网络
- 十五、TensorFlow 集群的分布式模型
- 十六、移动和嵌入式平台上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、调试 TensorFlow 模型
- 十九、张量处理单元
- TensorFlow 机器学习秘籍中文第二版
- 一、TensorFlow 入门
- 二、TensorFlow 的方式
- 三、线性回归
- 四、支持向量机
- 五、最近邻方法
- 六、神经网络
- 七、自然语言处理
- 八、卷积神经网络
- 九、循环神经网络
- 十、将 TensorFlow 投入生产
- 十一、更多 TensorFlow
- 与 TensorFlow 的初次接触
- 前言
- 1. TensorFlow 基础知识
- 2. TensorFlow 中的线性回归
- 3. TensorFlow 中的聚类
- 4. TensorFlow 中的单层神经网络
- 5. TensorFlow 中的多层神经网络
- 6. 并行
- 后记
- TensorFlow 学习指南
- 一、基础
- 二、线性模型
- 三、学习
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 构建简单的神经网络
- 二、在 Eager 模式中使用指标
- 三、如何保存和恢复训练模型
- 四、文本序列到 TFRecords
- 五、如何将原始图片数据转换为 TFRecords
- 六、如何使用 TensorFlow Eager 从 TFRecords 批量读取数据
- 七、使用 TensorFlow Eager 构建用于情感识别的卷积神经网络(CNN)
- 八、用于 TensorFlow Eager 序列分类的动态循坏神经网络
- 九、用于 TensorFlow Eager 时间序列回归的递归神经网络
- TensorFlow 高效编程
- 图嵌入综述:问题,技术与应用
- 一、引言
- 三、图嵌入的问题设定
- 四、图嵌入技术
- 基于边重构的优化问题
- 应用
- 基于深度学习的推荐系统:综述和新视角
- 引言
- 基于深度学习的推荐:最先进的技术
- 基于卷积神经网络的推荐
- 关于卷积神经网络我们理解了什么
- 第1章概论
- 第2章多层网络
- 2.1.4生成对抗网络
- 2.2.1最近ConvNets演变中的关键架构
- 2.2.2走向ConvNet不变性
- 2.3时空卷积网络
- 第3章了解ConvNets构建块
- 3.2整改
- 3.3规范化
- 3.4汇集
- 第四章现状
- 4.2打开问题
- 参考
- 机器学习超级复习笔记
- Python 迁移学习实用指南
- 零、前言
- 一、机器学习基础
- 二、深度学习基础
- 三、了解深度学习架构
- 四、迁移学习基础
- 五、释放迁移学习的力量
- 六、图像识别与分类
- 七、文本文件分类
- 八、音频事件识别与分类
- 九、DeepDream
- 十、自动图像字幕生成器
- 十一、图像着色
- 面向计算机视觉的深度学习
- 零、前言
- 一、入门
- 二、图像分类
- 三、图像检索
- 四、对象检测
- 五、语义分割
- 六、相似性学习
- 七、图像字幕
- 八、生成模型
- 九、视频分类
- 十、部署
- 深度学习快速参考
- 零、前言
- 一、深度学习的基础
- 二、使用深度学习解决回归问题
- 三、使用 TensorBoard 监控网络训练
- 四、使用深度学习解决二分类问题
- 五、使用 Keras 解决多分类问题
- 六、超参数优化
- 七、从头开始训练 CNN
- 八、将预训练的 CNN 用于迁移学习
- 九、从头开始训练 RNN
- 十、使用词嵌入从头开始训练 LSTM
- 十一、训练 Seq2Seq 模型
- 十二、深度强化学习
- 十三、生成对抗网络
- TensorFlow 2.0 快速入门指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 简介
- 一、TensorFlow 2 简介
- 二、Keras:TensorFlow 2 的高级 API
- 三、TensorFlow 2 和 ANN 技术
- 第 2 部分:TensorFlow 2.00 Alpha 中的监督和无监督学习
- 四、TensorFlow 2 和监督机器学习
- 五、TensorFlow 2 和无监督学习
- 第 3 部分:TensorFlow 2.00 Alpha 的神经网络应用
- 六、使用 TensorFlow 2 识别图像
- 七、TensorFlow 2 和神经风格迁移
- 八、TensorFlow 2 和循环神经网络
- 九、TensorFlow 估计器和 TensorFlow HUB
- 十、从 tf1.12 转换为 tf2
- TensorFlow 入门
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 数学运算
- 三、机器学习入门
- 四、神经网络简介
- 五、深度学习
- 六、TensorFlow GPU 编程和服务
- TensorFlow 卷积神经网络实用指南
- 零、前言
- 一、TensorFlow 的设置和介绍
- 二、深度学习和卷积神经网络
- 三、TensorFlow 中的图像分类
- 四、目标检测与分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自编码器,变分自编码器和生成对抗网络
- 七、迁移学习
- 八、机器学习最佳实践和故障排除
- 九、大规模训练
- 十、参考文献