面向绝对初学者的机器学习:大约 10 分钟内您的第一个神经网络 & < 20 行代码!
面向绝对初学者的机器学习:大约 10 分钟内您的第一个神经网络 & < 20 行代码!
学习任何新事物最困难的部分就是打破这种心理惯性,让你的思想沉迷于努力和回报的循环中。然而,将任何新事物融入这个循环需要大量的练习,而这必须由持续的动力推动。但是由于当前社交媒体应用程序的设计,我们的注意力广度急剧下降,因此我们中的许多人在动机和注意力方面都在挣扎。此外,当涉及到学习一个巨大的话题时 机器学习 (ML),存在许多需要克服的挑战 .其中一些是:
- 它实际上 跨域话题 ,需要来自多个领域和来源的知识才能对它有正确的感觉。
- 这是很 动态的 .每天都会遇到一些需要学习的新东西;无论是在框架、文献、最佳实践等方面。
- 有 无数的资源 (就像这个)可以指导您的 ML 旅程。但是,我个人经常发现,您找不到可以全面训练您的“灵丹妙药”,因此您需要仔细选择从哪里开始,而不会有精疲力竭的风险。因此,我以跳板的形式创建了这篇文章,以快速开始 ML 之旅。
- 从外部看,ML 似乎非常诱人和有前途。只有当一个人开始研究它(以自上而下的方法)时,它才会意识到,在真正看到自己的“人工智能存在”之前,需要经历一段艰巨的理论和文学篇章。
我个人相信在尝试进入新领域时遵循自下而上的方法(首先从应用程序开始)。它使您能够意识到该领域的潜力和局限性。此外,能够快速实现领域应用的纯粹乐趣激发了足够的动力来推动旅程的剩余部分。正是由于这个原因,我才策划了这个应用程序特定的内容, 特别针对想要尽快进入 ML 领域的绝对初学者! 在本文中,我们将使用我们之前对 ML 的简短讨论 文章 ¹。只需快速浏览一下即可获得一些有趣的见解 机器学习的内容和原因 在我们准备起飞之前!
假设您已经阅读了前面提到的文章(连同免责声明!),让我们开始我们的 ML 之旅。我们将创建最陈词滥调但基本的 ML 模型:图像分类器。图像分类器是一种可以将给定图像分类为不同类别的模型。我们的图像分类器的规格如下:
- 使用的分类器将是人工神经网络 (ANN)
- 我们将要分类的图像应来自 MNIST 数据集
A glimpse of the MNIST dataset
尽管我们可以使用卷积神经网络 (CNN) 来完成这项任务,但我不想让您不必要地复杂化。同时,我也想让你意识到一个只有几层的简单人工神经网络有多么强大(层在前面的文章中已经简要讨论过)。
因此,在我们开始实施 ANN 之前,请确保您对 Python 编程语言、Tensorflow、Keras 有很好的了解,并拥有一台至少有 16GB 内存的个人电脑……开玩笑的!事实上,使用 TensorFlow 这样的工具,您不一定需要精通编程语言(尽管建议您更好地控制您的实现),也不需要了解 ANN 如何工作的更深层次的细节。此外,使用 Google Colab,您无需高端系统即可运行 ML 模型。它提供了一个简洁而强大的生态系统,您可以在其中从头开始开发模型。最好的部分, Google Colab 已随 TensorFlow 一起安装 !
所以我们从 Google Colab 开始:
1. 在 google 中搜索“google colab”并点击第一个链接。
2. Colab 页面将打开。单击“文件”(左上角),然后单击“新建笔记本”。
笔记本是一种在单个工作区中编写代码/文本、生成图表和嵌入图像的绝妙方式。
3. 您将被要求登录您的谷歌帐户。就这样继续吧。
4. 现在您将看到一个空白笔记本:您自己的个人空间,用于编写自定义代码、创建令人印象深刻的图形文档和运行 ML 模型。
如上图所示(顶部的深灰色矩形),笔记本本质上具有单元格。您可以在此单元格中执行前面提到的功能。此外,您可以拥有多个这样的单元格,从而更好地组织您的内容。从编码的角度来看,您可以在不同的时间运行不同的单元格。因此,整个程序可以分成不同的部分。如果需要,每个单元格的结果将结转到后面的单元格中使用!
5. 现在让我们编写我们的第一段代码。两个数字相加的程序。在第一个单元格中写下以下内容:
2+3
你刚刚写了你的第一段代码!现在是时候运行它了。只需单击单元格左侧的播放按钮即可。运行单元格的另一种方法是在光标位于单元格内时同时按“shift”和“enter”。如下所示,笔记本可能需要一些时间来初始化和分配资源来为您执行计算。
单元格完成执行后,您将获得输出为 5!请注意,已成功完成执行的单元格左侧会出现一个绿色勾号。始终等待显示此绿色勾号以完成特定单元格的执行。
瞧!你在 Colab 中运行了你的第一段代码! (Colab 被 ML 研究人员和爱好者积极使用,因此它确实是您 ML 旅程中的一个里程碑)。您现在可以删除此单元格,为您的 ANN 重新开始。只需单击单元格右上角的 bin 图标即可。
6. 现在您已经知道如何在 Colab 中编写和运行代码,我们开始为 ANN 进行实际编码(使用 Python 编程语言)。我们将在 ANN 实施中采取以下步骤:
- 导入库 :图书馆是已经由某人创建的软件,可以根据自己的要求使用。要使用库,必须在代码之前特别提及它,以便在执行期间知道要使用哪个库。我们在 Python 中使用“导入”一词来提及要使用的库。
- 加载数据集 :如之前的文章¹中所讨论的,数据用于训练 ANN。我们将使用 MNIST 数据集来训练我们的 ANN。 MNIST 数据集是 70,000 张图像的集合。其中 60,000 个通常用于训练,其余用于测试 ANN。所有图像都是从 0 到 9 的十进制数字。
- 定义模型 : 需要先定义模型,然后才能对其进行训练。它需要定义ANN中应该有多少层和什么类型的层,每一层应该有多少神经元,以及每一层将使用什么激活函数。
- 编译模型: 编译需要定义模型的损失和优化参数。这些只是切割模板的方法¹。
- 拟合模型: 该模型通过向模型提供数据并在模型上运行多个更新和更正周期来“拟合”数据集。此步骤也称为训练模型。
- 预言: 这是您可以使用经过训练的模型为您执行预测的最后一部分。将图像提供给您已经知道该类的模型。模型预测的类别可以与其“真实”类别进行比较。
注意:我们没有包括某些步骤(如交叉验证和评估)以使事情变得更简单。稍后将讨论它们。
所以让我们完成对我们的 ANN 的编码:
-
导入库: 复制单元格中的以下内容并运行它。
从 tensorflow.keras.models 导入顺序
从 tensorflow.keras.layers 导入 Dense,Flatten,Conv2D,MaxPooling2D
从 tensorflow.keras.datasets 导入 mnist
将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np
我们将在这里使用 TensorFlow 库。我们从 TensorFlow 导入“Sequential”模型,这只是创建 ML 模型的一种风格。然后我们导入将在 ANN 中使用的不同类型的层(Dense、Flatten、Conv2D、MaxPooling2D)(不要担心“类型”)。此后,我们导入包含实际图像的“mnist”数据集来训练我们的 ANN。 Tensorflow 有很多东西可以提供! (人工神经网络组件和数据集)。然后我们导入“matlplotlib”库,该库允许通过将数字/数字矩阵转换为图像来显示图形和图像。最后我们导入了'numpy'库,它使得矩阵的操作变得非常容易。请记住,这里的图像最终是数字的网格或矩阵,可以对其进行操作,从而产生更多的矩阵。
-
加载数据集: 在下一个单元格中复制以下内容并运行它。
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = x_train/255
x_test = x_test/255
'mnist.load_data()' 只是为您的浏览器会话加载 MNIST 数据集。 “加载”是在不同的变量(内容容器)中完成的:
2.1 x_train:存储用于训练ANN的所有图像的变量,也称为训练样本。
2.2 y_train:存储训练样本的所有标签(类号)的变量。
2.3 x_test:存储所有用于测试ANN的图像的变量,也称为测试样本。不过我们不会使用它。
2.4 y_test:存储测试样本的所有标签(类号)的变量。
将数据加载到这些变量中后,您现在可以使用此数据集的图像。在下一行中将变量除以 255 只是对训练/测试数据('x_train'、'x_test')的每个像素的值/强度进行归一化。这有助于模型高效快速地训练。
-
定义模型: 在下一个单元格中复制以下内容并运行它。
模型=顺序([
展平(输入形状=(28,28)),
密集(32,激活='重读'),
密集(10,激活='softmax')
])
可以看出,我们创建了一个具有“顺序”风格的“模型”(还有其他风格可以做到)。我们还定义了模型的层。第一层是“Flatten”层,它将我们的二维图像(大小为 28x28 像素)转换为一维数字数组,可以馈送到 ANN 的后半部分。然后我们有一个“密集”层,其中有 32 个神经元。这些神经元中的每一个都将我们图像的像素值作为输入,对其求和,对其应用激活函数(“relu”激活函数仅在输入阈值后才允许高输出),然后给出输出。然后我们有最后一个“密集”层,它有 10 个神经元。这些神经元中的每一个都将输入前一层的值,并根据输入图像的类别输出一个高值。例如,如果输入图像属于第 3 类,则最后一层的第三个神经元将具有高输出(使用“softmax”激活函数来实现这一点)。
-
编译模型: 在下一个单元格中复制以下内容并运行它。
model.compile(loss = "sparse_categorical_crossentropy",优化器 = "adam",metrics = ['accuracy'])
该模型是通过定义“损失”的类型、“优化器”和要分析的可选“指标”来编译的。 “损失”用于将模型的当前预测(输出)与输入的实际类别进行比较。 “优化器”用于根据“损失”调整模型的参数(适当地切割模板¹)。 “损失”和“优化器”都存在多种方式。 “指标”是模型的性能度量,您可能希望在训练时对其进行检查。我们希望在模型经过训练阶段时密切关注它的准确性,因此我们在“指标”中使用“准确性”。
-
拟合模型: 在下一个单元格中复制以下内容并运行它。
model.fit(x_train,y_train,epochs = 5)
现在一切就绪,我们可以将模型“拟合”到数据中。但什么是合适的?回到我们上次讨论的模板示例¹。 Fitting there 是指将我们的模板重叠在实际的叶子上并切割模板,直到因此创建的孔与实际叶子的边界匹配,即我们的模板适合叶子。因此,对于我们的 ANN,我们将训练样本 (x_train) 及其标签 (y_train) 都提供给它,以使其适应图像和标签(类)之间的真实映射。 'epochs' 可以理解为您希望模型在相同数据上训练的次数。此步骤需要时间,具体取决于“时期”,因为每次模型运行 MNIST 数据集的所有 60,000 张图像时。所以请耐心等待,直到绿色刻度出现在单元格的左侧。
在打印状态时,还要注意每个时期的“准确性”指标。它在各个时期不断增加,远高于 0.96(96%)!
-
预言: 在下一个单元格中复制以下内容并运行它。
图像索引 = 9
plt.imshow(x_train[image_index])
plt.show()
print("上图的预测类为:",np.argmax(model.predict(x_train[image_index][np.newaxis,...])))
我们刚刚实现了我们的第一个“人工智能”!人工神经网络已经过训练,现在可以用来为我们预测图像的类别(标签)。我们该怎么做呢?只需使用“model.predict()”函数即可。在括号内,我们需要给出我们想要测试的图像。 'x_train[image_index][np.newaxis,…]' 是训练数据集中的图像。 'image_index' 只是我们选择从训练图像集合中预测的图像的索引(如序列号)。您可以将“image_index”的值从 9 更改为任何其他值(在限制范围内)以预测其他图像样本。 'plt.imshow()' 也在括号内获取图像,只是显示我们预测的图像,以便我们确定实际的类。
如上所示,预测的类别(4)与图像(编号 4)相匹配。
您刚刚制作了一个非常著名的 ML 模型,即 ANN。事实上,ML 社区的大量关注点都围绕着这类模型。
您还应该欣赏这样一个事实 这么简单的模型 (只有3层)能够非常 准确分类如此庞大的图像集合 (60,000 张图像)。想象一下使用基于规则的方法实现这一目标的艰巨任务,如果你能做到的话。 这就是人工神经网络的力量 .最重要的是,您可以在不到 20 行代码中实现这种接近最先进的性能!这一切都归功于 TensorFlow。
我敢肯定,现在你会很高兴与 ANN 一起尝试新事物。比如添加更多的层,在看不见的数据上测试它,改变激活函数,改变神经元的数量,寻找人工神经网络做出错误预测的图像(潘多拉魔盒本身),为什么会这样做以及如何避免那。您可能还想询问“keras”。我现在强烈建议您注意我们在 Internet 上使用的每一行代码,并以自下而上的方法详细研究它们。这将帮助您对该实施充满信心,并为即将到来的 ML 之旅做好准备!
再见。到那时,继续让你的 ANN 变得更聪明!
参考:
[1] 对绝对初学者的人脑和机器学习的简要介绍! ( https://medium.com/@pandey.suraj3/a-very-brief-peek-into-the-human-brain-and-machine-learning-for-absolute-beginners-4c9b82c77e67 )
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明