机器学习入门“Hello, World”

1. 准备工作

在此 Codelab 中,您将学习机器学习的基础知识,您将构建一个基于数据进行训练的系统,以推断用于确定各种关系的规则,而不是使用 Java 或 C++ 等语言编程显式规则。

请考虑以下问题:您要构建一个系统,能够跟踪健身情况,识别运动状态。您或许需要访问用户行走的速度,并尝试基于速度这个条件推断用户的活动情况。

cc3628d9a1547597.png

if(speed<4){
  status=WALKING;
}

您可以使用其他条件扩展该变量。

f2cc3929221107b8.png

if(speed<4){
    status=WALKING;
} else {
    status=RUNNING;
}

在最后一个条件下,您可以使用类似方法检测循环。

aeb282cf03d5cff.png

if(speed<4){
    status=WALKING;
} else if(speed<12){
    status=RUNNING;
} else {
    status=BIKING;
}

现在请考虑,当您想添加活动(如高尔夫)时,会发生什么情况。如何创建规则来确定这样的活动,则不那么显而易见。

fc772abb6fee2804.png

// Now what?

编写一个能够识别高尔夫活动的程序极难,您该怎么办?您可以使用机器学习来解决问题!

前提条件

在尝试此 Codelab 之前,您需要:

  • 扎实的 Python 知识
  • 基本编程技能

学习内容

  • 机器学习的基础知识

您将构建的内容

  • 您的首个机器学习模型

所需条件

如果您从未使用 TensorFlow 创建过机器学习模型,则可以使用 Colaborator,这是一个基于浏览器的环境,包含所有必需的依赖项。您可以找到在 Colab 中运行其余 Codelab 的代码。

如果您使用其他的 IDE,请确保您已安装 Python。您还需要 TensorFlow 和 NumPy 库。您可以在此处详细了解并安装 TensorFlow点击此处安装 NumPy

2. 什么是机器学习?

考虑构建应用的传统方式,如下图所示:

c72f871306134e45.png

您使用一种编程语言表达规则。这些规则根据数据执行操作,而您的程序会提供答案**。**在活动检测中,规则(您编写的用于定义活动类型的代码)会根据数据(用户的移动速度)生成答案:函数的返回值,用于确定用户的活动状态(无论是在步行、跑步、骑车还是做其他事情)。

通过机器学习检测活动状态的过程非常相似,只是轴线不同。

9b85a337ee816e1b.png

您无需尝试定义规则并使用编程语言表达规则,只需提供答案(通常称为“标签”)以及数据,机器即可推断出用于确定答案与数据之间关系的规则。例如,您的活动检测场景在机器学习环境中可能如下所示:

6ff58697a85931f4.png

您需要收集大量数据,并有效地标记其为“这是步行的样子”或“这是跑步的样子”。然后,计算机可以根据数据推断出决定某一特定活动的不同模式的规则。

除了在某一场景中作为编程的替代方法,该方法还可让您打开新的场景,例如在基于规则的传统编程方法中可能无法实现的高尔夫场景。

在传统编程中,代码被编译为通常称为程序的二进制文件。在机器学习中,您通过数据和标签创建的项称为模型。

因此,如果您回到此图表:

53ff9e2cb511936e.png

将该操作的结果视为一个模型,在运行时如下所示:

693430bb4d7fa001.png

您向模型传递一些数据,然后模型会使用从训练中推断的规则进行预测,例如,“该数据似乎表示在步行”或“该数据似乎表示在骑车”。

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])])

接下来,编写代码以编译神经网络。执行此操作时,您需要指定两个函数:lossoptimizer

在此示例中,您知道这些数字之间的关系是 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)

例如,您可以看到在前几个周期中,损失值很大,但每一步都会变小。

f110d5abed07c1b9.png

随着训练的进行,损失很快就会减少。

81ca5e71298b414b.png

当训练完成时,损失非常小,这表明模型在推断数字之间的关系方面表现不错。

12b187014b639fd.png

您可能不需要全部 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 构建计算机视觉模型