Path: blob/master/site/zh-cn/guide/basic_training_loops.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
基本训练循环
在前面的教程里,您已经了解了tensors, variables, gradient tape, 和modules。在这篇教程,您将把它们放在一起训练模型。
此外,TensorFlow 还包括 tf.Keras API,这是一种高级神经网络 API,可提供有用的抽象来减少样板。但是,在本指南中,您将使用基本类。
创建
解决机器学习问题
解决一个机器学习问题通常包含以下步骤:
获得训练数据。
定义模型。
定义损失函数。
遍历训练数据,从目标值计算损失。
计算该损失的梯度,并使用optimizer调整变量以适合数据。
计算结果。
为了便于说明,在本指南中,您将开发一个简单的线性模型, , 其中包含两个变量: (权重) 和 (偏差)。
这是最基本的机器学习问题:给定 和 ,尝试通过简单的线性回归来找到直线的斜率和偏移量。
数据
监督学习使用输入(通常表示为 x)和输出(表示为 y,通常称为标签)。目标是从成对的输入和输出中学习,以便您可以根据输入预测输出的值。
TensorFlow中几乎每个输入数据都是由张量表示,并且通常是向量。监督学习中,输出(即想到预测值)同样是个张量。
下面是通过将高斯(正态)噪声添加到直线上的点而合成的一些数据。
张量通常以 batches 的形式聚集在一起,或者是成组的输入和输出堆叠在一起。批处理能够对训练过程带来一些好处,并且可以与加速器和矢量化计算很好地配合使用。给定此数据集的大小,您可以将整个数据集视为一个批次。
定义模型
使用 tf.Variable
代表模型中的所有权重。tf.Variable
能够存储值,并根据需要以张量形式提供它。详情请见 variable guide。
使用 tf.Module
封装变量和计算。您可以使用任何Python对象,但是通过这种方式可以轻松保存它。
这里,您可以定义 w 和 b 为变量。
初始变量在此处以固定方式设置,但 Keras 提供了您可以与或不与 Keras 其他部分一起使用的许多初始值设定项。
定义损失函数
损失函数衡量给定输入的模型输出与目标输出的匹配程度。目的是在训练过程中尽量减少这种差异。定义标准的L2损失,也称为“均方误差”:
在训练模型之前,您可以可视化损失值。使用红色绘制模型的预测值,使用蓝色绘制训练数据。
定义训练循环
训练循环按顺序重复执行以下任务:
发送一批输入值,通过模型生成输出值
通过比较输出值与输出(标签),来计算损失值
使用梯度带(GradientTape)找到梯度值
使用这些梯度优化变量
这个例子中,您可以使用 gradient descent训练数据。
tf.keras.optimizers
中有许多梯度下降的变量。但是本着搭建的第一原则,您将在这里 借助tf.GradientTape
的自动微分和tf.assign_sub
的递减值(结合了tf.assign
和tf.sub
)自己实现基本数学:
要查看训练,您可以通过训练循环发送同一批次的 x 和 y,并观察 W
和 b
如何变化。
进行训练
下面是权重随时间的演变:
呈现训练的模型的性能
使用Keras完成相同的解决方案
将上面的代码与Keras中的等效代码进行对比很有用。
如果您将tf.keras.Model
子类化,则定义模型与其看起来完全相同。请记住,Keras模型最终从模块继承。
您可以使用Keras的内置功能作为捷径,而不必在每次创建模型时都编写新的训练循环。当您不想编写或调试Python训练循环时,这很有用。
如果您使用Keras,您将会需要使用 model.compile()
去设置参数, 使用model.fit()
进行训练。借助Keras实现L2损失和梯度下降需要的代码量更少,就像一个捷径。Keras损失和优化器也可以在这些便利功能之外使用,而前面的示例也可以使用它们。
Kerasfit
期望批处理数据或完整的数据集作为NumPy数组。 NumPy数组分为多个批次,默认批次大小为32。
这一案例中,为了匹配手写训练循环,您应该以大小为1000的单批次传递x。
请注意,Keras会在训练后而不是之前打印出损失,因此第一次损失会显得较低。否则,这表明本质上相同的训练效果。