Copyright 2020 The TensorFlow Authors.
TensorFlow 基础知识
本指南提供TensorFlow 基础知识的快速概览。本文档的每个部分都是对一个大主题的概述——您可以在每个部分的末尾找到指向完整指南的链接。
TensorFlow 是一个端到端的机器学习平台。它支持以下内容:
基于多维数组的数值计算(类似于NumPy 。)
GPU 和分布式处理
自动微分
模型构造、训练和导出
及更多内容
张量
TensorFlow 对tf.Tensor
对象表示的多维数组或张量进行运算。下面一个二维张量:
tf.Tensor
最重要的属性是它的shape
(形状)和dtype
(数据类型) :
Tensor.shape
:表示张量每个轴上的大小。Tensor.dtype
:表示张量中所有元素的类型。
TensorFlow 实现了对张量的标准数学运算,以及许多机器学习的专用操作。
例如:
注:通常,在 TensorFlow 函数需要 Tensor
作为输入的任何地方,该函数也将接受可使用 tf.convert_to_tensor
转换为 Tensor
的任何内容。请参见下面的示例。
在 CPU 上运行大型计算可能会很慢。配置正确的 TensorFlow 可以使用 GPU 等加速硬件非常快速地运算。
详情参阅 Tensor guide (张量指南)。
变量
普通的tf.Tensor
对象是不可变的。要在 TensorFlow 中存储模型权重(或其他可变状态),请使用tf.Variable
。
详见 Variables guide (变量指南)。
自动微分
Gradient descent(梯度下降)及相关算法是现代机器学习的基础。
为此,TensorFlow 实现了自动微分 (autodiff),它使用微积分来计算梯度。通常用它来计算模型基于其权重的误差或损失的梯度。
在 x = 1.0
, y = f(x) = (1**2 + 2*1 - 5) = -2
.
y
的导数是 y' = f'(x) = (2*x + 2) = 4
。 TensorFlow 可以自动计算:
这个简化的例子只对单个标量 ( x
) 求导,但 TensorFlow 可以同时计算任意数量的非标量张量的梯度。
详见 Autodiff guide (自动微分)。
图和 tf.function装饰器
TensorFlow 可以像任何 Python 库一样以交互方式使用,同时还提供以下工具:
性能优化:加速训练和推理。
导出:保存训练好的模型。
这就要用 tf.function
装饰器将纯 TensorFlow 代码与普通 Python 代码隔离开来。
第一次运行由tf.function
装饰的函数时,虽然它在 Python 中执行,但它会取得一个经由 TensorFlow 计算的完整优化图。
在后续调用中,TensorFlow 仅执行优化图,跳过所有非 TensorFlow 步骤。注意下面的my_func
不打印Tracing,因为print
是 Python 函数,而不是 TensorFlow 函数。
输入的签名(shape
和dtype
)不同,就不能使用原来的图,要生成一个新图:
详见 Intro to graphs (图的说明).
模块、层和模型
tf.Module
是一个类,用于管理tf.Variable
对象以及对它们进行操作的tf.function
对象。 有了tf.Module
类,才能支持下面两个重要特性:
可以用
tf.train.Checkpoint
保存和恢复变量的值。因为可以快速保存和恢复模型的状态,所以在训练期间很有用。可以用
tf.saved_model
导入和导出tf.Variable
值和tf.function
图。这使得模型可以不依赖原来的 Python 程序独立运行。
下面是一个导出简单tf.Module
对象的完整例子:
保存Module
:
保存的图独立于创建它的代码。您可以从 Python、其他语言绑定或TensorFlow Serving加载保存的图。还可以通过转换,让它在TensorFlow Lite或TensorFlow JS上运行。
建立在tf.Module
上的tf.keras.layers.Layer
类和tf.keras.Model
类,为构建、训练和保存模型提供了更多的功能和便利。下一节中将展示其中一部分。
详见 Intro to modules (模块介绍).
训练循环
现在用这些东西一起构建一个基本模型并从头开始训练。
首先,生成一些示例数据,这是一些围绕二次曲线的松散的点形成的云:
创建一个具有随机初始化权重和偏差的二次模型:
首先,在训练前观察您的模型的性能:
现在,为您的模型定义损失:
鉴于此模型的作用是预测连续值,因此均方误差 (MSE) 是损失函数的不错选择。给定一个预测向量 和一个真实目标向量 ,MSE 被定义为预测值与基准值之间平方差的平均值。
为模型编写一个基本训练循环。此循环将利用 MSE 损失函数及其相对于输入的梯度来迭代更新模型的参数。使用 mini-batch 进行训练可以提供内存效率和更快的收敛速度。tf.data.Dataset
API 具有用于批处理和重排的实用函数。
现在,观察模型在训练后的性能:
成功了,但请记住,tf.keras
模块中提供了常见训练实用工具的实现。因此在您自己动手编写之前,请优先考虑使用现成的内容。首先,Model.compile
和 Model.fit
方法为您实现了一个训练循环:
首先,使用 tf.keras.Sequential
在 Keras 中创建一个序贯模型。最简单的 Keras 层之一是密集层,可以使用 tf.keras.layers.Dense
进行实例化。密集层能够学习 形式的多维线性关系。要学习 形式的非线性方程,密集层的输入应当是一个以 和 为特征的数据矩阵。lambda 层 tf.keras.layers.Lambda
可用于执行这种堆叠转换。
训练后观察 Keras 模型的性能: