关于此 Codelab
1. 准备工作
在此 Codelab 中,您将学习机器学习的基础知识,您将构建一个基于数据进行训练的系统,以推断用于确定各种关系的规则,而不是使用 Java 或 C++ 等语言编程显式规则。
请考虑以下问题:您要构建一个系统,能够跟踪健身情况,识别运动状态。您或许需要访问用户行走的速度,并尝试基于速度这个条件推断用户的活动情况。
if(speed<4){
status=WALKING;
}
您可以使用其他条件扩展该变量。
if(speed<4){
status=WALKING;
} else {
status=RUNNING;
}
在最后一个条件下,您可以使用类似方法检测循环。
if(speed<4){
status=WALKING;
} else if(speed<12){
status=RUNNING;
} else {
status=BIKING;
}
现在请考虑,当您想添加活动(如高尔夫)时,会发生什么情况。如何创建规则来确定这样的活动,则不那么显而易见。
// Now what?
编写一个能够识别高尔夫活动的程序极难,您该怎么办?您可以使用机器学习来解决问题!
前提条件
在尝试此 Codelab 之前,您需要:
- 扎实的 Python 知识
- 基本编程技能
学习内容
- 机器学习的基础知识
您将构建的内容
- 您的首个机器学习模型
所需条件
如果您从未使用 TensorFlow 创建过机器学习模型,则可以使用 Colaborator,这是一个基于浏览器的环境,包含所有必需的依赖项。您可以找到在 Colab 中运行其余 Codelab 的代码。
如果您使用其他的 IDE,请确保您已安装 Python。您还需要 TensorFlow 和 NumPy 库。您可以在此处详细了解并安装 TensorFlow。点击此处安装 NumPy。
2. 什么是机器学习?
考虑构建应用的传统方式,如下图所示:
您使用一种编程语言表达规则。这些规则根据数据执行操作,而您的程序会提供答案**。**在活动检测中,规则(您编写的用于定义活动类型的代码)会根据数据(用户的移动速度)生成答案:函数的返回值,用于确定用户的活动状态(无论是在步行、跑步、骑车还是做其他事情)。
通过机器学习检测活动状态的过程非常相似,只是轴线不同。
您无需尝试定义规则并使用编程语言表达规则,只需提供答案(通常称为“标签”)以及数据,机器即可推断出用于确定答案与数据之间关系的规则。例如,您的活动检测场景在机器学习环境中可能如下所示:
您需要收集大量数据,并有效地标记其为“这是步行的样子”或“这是跑步的样子”。然后,计算机可以根据数据推断出决定某一特定活动的不同模式的规则。
除了在某一场景中作为编程的替代方法,该方法还可让您打开新的场景,例如在基于规则的传统编程方法中可能无法实现的高尔夫场景。
在传统编程中,代码被编译为通常称为程序的二进制文件。在机器学习中,您通过数据和标签创建的项称为模型。
因此,如果您回到此图表:
将该操作的结果视为一个模型,在运行时如下所示:
您向模型传递一些数据,然后模型会使用从训练中推断的规则进行预测,例如,“该数据似乎表示在步行”或“该数据似乎表示在骑车”。
3. 创建您的首个机器学习模型
请注意以下几组数字。您能否看出它们之间的关系?
X: | -1 | 0 | 1 | 2 | 3 | 4 |
Y: | -2 | 1 | 4 | 7 | 10 | 13 |
观察这些数字时,您可能会注意到 X 的值从左向右依次增加 1,而 Y 的值相应地依次增加 3。您可能认为 Y 等于 3X 再加或减某一数字。然后,您可以看到 X 为 0 时 Y 为 1,然后得出 Y=3X+1 的关系。
这正是您利用代码训练模型来识别数据中模式的准确方式!
现在,我们来看一下执行该操作的代码。
您如何训练神经网络执行等效任务?运用数据!向数据馈入一组 X 和一组 Y,它应该能够找出两者之间的关系。
导入数据
首先进行导入。在此处,您将导入 TensorFlow 并将其命名为 tf
,以方便使用。
接下来,导入名为 numpy
的库,该库可以轻松而快速地以列表形式展示您的数据。
将神经网络定义为一组顺序层的框架称为 keras
,因此也要导入该框架。
import tensorflow as tf
import numpy as np
from tensorflow import keras
定义并编译神经网络
接下来,创建尽可能最简单的神经网络。该神经网络有一个层,该层有一个神经元,其输入形状只有一个值。
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
接下来,编写代码以编译神经网络。执行此操作时,您需要指定两个函数:loss
和 optimizer
。
在此示例中,您知道这些数字之间的关系是 Y=3X+1。
当计算机尝试获取这些内容时,神经网络模型会进行猜测,例如是 Y=10X+10。loss
函数将猜测答案与已知正确答案进行对比,并衡量结果的好坏。
接下来,模型使用 optimizer
函数进行另一个猜测。它会根据损失函数的结果,最大限度地减少损失。此时,可能会得到 Y=5X+5 之类的内容。虽然这样仍有些糟糕,但更接近正确的结果(损失更低)。
模型会针对即将经历的周期(您很快就会看到)执行同样的操作。
首先,以下方法将告知模型使用 mean_squared_error
表示损失,以及随机梯度下降法 (sgd
) 作为优化器。您目前还无需了解这些方法的数学,但可以看到其效果!
随着时间的推移,您将了解不同场景的不同且适当的损失和优化器函数。
model.compile(optimizer='sgd', loss='mean_squared_error')
提供数据
接下来,请提供一些数据。在此示例中,您将获取之前六个 X 和六个 Y 变量。您可以看到两者之间的关系是 Y=3X+1,其中X为 -1,Y 为 -2。
名为 NumPy 的 Python 库提供了许多数组类型的数据结构来实现此目的。在 NumPy 中使用 np.array[]
将值指定为数组。
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)
现在,您已经具备了定义神经网络所需的全部代码。下一步是训练该代码,查看它能否推断出这些数字之间的模式,并使用其创建模型。
4. 训练神经网络
训练神经网络的过程是在 model.fit
调用中的,神经网络从其中了解 X 和 Y 之间的关系。在这种情况下,它会在进行猜测、衡量好坏(损失),或通过优化器做出另一个猜测之前遍历整个循环。它会按照您指定的周期数运行。运行该代码时,您会看到每个周期输出的损失。
model.fit(xs, ys, epochs=500)
例如,您可以看到在前几个周期中,损失值很大,但每一步都会变小。
随着训练的进行,损失很快就会减少。
当训练完成时,损失非常小,这表明模型在推断数字之间的关系方面表现不错。
您可能不需要全部 500 个周期,并可以尝试不同的量。从示例中可以看出,损失在 50 个周期后真的非常少,因此这可能就足够了!
5. 使用模型
您的模型已经过训练,可以了解 X 和 Y 之间的关系。您可以使用 model.predict
方法求出先前未知 X 的 Y。例如,如果 X 为 10,您认为 Y 为多少?在运行以下代码之前,进行猜测:
print(model.predict([10.0]))
您可能本来认为是 31,但最终的结果有点复杂。您为何如此认为?
神经网络处理概率,因此它计算出 X 和 Y 之间的关系有很高的概率为 Y=3X+1,但仅凭 6 个数据点不可能确定其关系。所得结果接近 31,但不一定是 31。
处理神经网络时,您会发现这种模式反复出现。您几乎总是需要处理概率,而不是处理确定性,并且需要进行一些编码,以根据概率来确定结果,尤其是在分类方面。
6. 恭喜
也许您不相信,您已经了解了机器学习中的大多数概念,而且您可以将这些概念应用于更复杂的场景中。您了解了如何训练神经网络,即通过定义神经网络来识别两组数字之间的关系。您定义了一组包含神经元(在本例中仅为一个)的层(在本例中仅为一层),然后使用损失函数和优化器进行编译。
网络、损失函数和优化器的集合可以处理猜测数字之间的关系、衡量其效果,然后为新的猜测生成新参数的过程。如需了解详情,请访问 TensorFlow.org。
了解详情
如需了解机器学习和 TensorFlow 如何帮助处理计算机视觉模型,请继续使用 TensorFlow 构建计算机视觉模型。