原文: How to Add Two Numbers – The Machine Learning Way

在机器学习领域,我们经常会遇到复杂的问题,从图像识别到自然语言处理。

但是,让我们退后一步,探索一些更基本但同样有趣的东西:加法!是的,你没看错,就是加法。

在本教程中,我们将构建一个神经网络,学习计算两个数字的和。

在开始学习之前,有一点需要注意:在实践中,我不建议使用机器学习求两个数的和。我在开始学习机器学习时,出于好奇尝试了一下。我只是希望与大家分享,让学习变得有趣。

你可以将本教程作为机器学习之旅的入门指南。初级机器学习工程师有时很难找到好的、干净的数据集。如果没有可靠的数据集,就很难研究和学习机器学习问题。

不过你不用担心,在本教程中,我们将创建自己的数据集(将成对的数字相加)并清理数据。这样,你就有了一个好的数据集,可以处理自己的问题以及训练模型。

好了,在深入学习之前,我们先来学习一些机器学习和深度学习的基础知识。

深度学习基础知识

我将在练习中使用一些机器学习和深度学习术语。因此,在深入学习之前,最好先通过几句话大概理解它们。

神经网络(Neural Network

神经网络是一种计算模型,其灵感来源于人脑的结构和功能。它由一层层相互连接的节点(神经元)组成。神经网络通过数据训练来学习模式并进行预测。

激活函数(Activation Function

激活函数应用于神经元的输出,以增加非线性。它允许神经网络学习数据中的复杂关系。常见的激活函数包括 ReLU(整流线性单位函数)和 Sigmoid 函数。

损失函数(Loss Function

损失函数是衡量模型预测与真实目标值匹配程度的指标。在训练过程中,目标是最小化损失函数,引导模型做出更好的预测。

梯度下降法(Gradient Descent

梯度下降法是一种用于最小化损失函数的优化算法。它以损失函数相对于参数的梯度为导向,沿着最陡下降的方向迭代调整模型参数。

反向传播(Backpropagation)

反向传播是一种用于训练神经网络的基本算法。它计算与每个模型参数相关的损失函数梯度,并在梯度下降过程中通过网络向后传播以更新权重。

批次数量(Batch Size)

批量大小表示训练过程中一次正向/反向传递所使用的训练样本数量。批次大小越大,训练速度越快,但需要的内存也越多。

训练轮数(Epoch)

一个 Epoch 表示在训练过程中对整个训练数据集进行一次完整的迭代。

在广阔的机器学习和深度学习领域,你会遇到很多术语,以上只是其中的几个。但它们足以帮助你理解下面的练习。

准备

以下是一份帮助你开始学习机器学习基础知识的清单。在学习本教程之前,你应该安装并准备好这些工具(但并非必须)。

  • 安装 Anaconda(它打包了许多默认的机器学习库)。
  • 在 Anaconda 中创建一个环境:强烈建议这样做,因为如果出现问题,只有创建的环境会受到影响。你的整个 Anaconda 安装不会受到影响。
  • 确保你有一个良好的代码编辑器/IDE,如 Visual Studio Code。
  • 安装 Keras(这是本练习的特定要求)。

这些都准备好了吗?希望你保持好状态。让我们开始练习吧。

如何使用机器学习求两个数的和

创建文件夹和文件

创建一个新文件夹,给它取个名字。导航进入文件夹并创建名为 addition.ipynb 的文件。在 Visual Studio Code 或其他 IDE 中打开该文件夹。

然后,按下 VS Code 左上角的 “+ Code” 按钮,为以下各部分创建代码块。

导入库

使用这些命令导入 numpykeras 库:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
导入要求的库

准备数据

机器学习模型的准确性有赖于训练模型的数据。

为了创建我们在这里需要的加法数据,让我们创建 1000 对随机数字作为输入。输出将是每对数字之和。

num_samples = 1000
X_train = np.random.rand(num_samples, 2)
y_train = X_train[:, 0] + X_train[:, 1]
生成输入数据集

定义神经网络

让我们构建一个有两个输入层的神经网络——一个有 8 个神经元的隐藏层和一个有单个神经元的输出层。我们将使用 “relu” 激活函数。

model = Sequential()
model.add(Dense(8, input_shape=(2,), activation='relu'))
model.add(Dense(1))
定义有 2 个输入层的模型

编译模型

使用 MSE(均方误差)作为损失函数和 Adam 优化器编译模型。

model.compile(loss='mse', optimizer='adam')
使用 MSE 编译模型

训练模型

对模型进行 100 轮训练,批次数量为 32。

batch_size = 32
epochs = 100
model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1)
训练模型

这可能需要几秒钟,取决于你的 CPU 配置。我的笔记本电脑大约需要 10 到 15 秒才能完成。

测试模型

现在我们已经训练好了模型,让我们用一些自定义输入来测试它。我使用了两个输入,但你也可以使用任意数量的输入来测试你的模型。

test_input = np.array([[1, 2], [0.3, 0.4]])
predicted_sum = model.predict(test_input)
通过自定义输入预测输出

打印数值

预测已经完成。让我们打印预测值,看看它们是否正确:

print("Predicted sums:")
print(predicted_sum)
打印预测的总和
image-187
预测值的输出示例

很接近,对吧?

总结

在本教程中,你学会了如何构建一个执行加法运算的神经网络。

如果你感到好奇,也可以尝试构建一个神经网络来执行减法运算。祝你好运 :)

希望你喜欢阅读本文。如果你想了解更多有关人工智能/机器学习/深度学习的信息,请访问我的网站订阅我的文章,那里有我所有博客的综合列表。