你好,TensorFlow
机器学习 (ML)是最近人人都在谈论的热门新技术,因为它非常擅长从数据中学习,从而预测未来类似事件的发生。手动进行机器学习相当繁琐,因为它通常涉及矩阵运算,而这在 JavaScript 中(或者说,在我看来,在任何语言中)都毫无乐趣可言😅。幸运的是,TensorFlow.js可以帮到你!它是一个开源库,内置了许多机器学习相关的功能,例如模型和算法,让你无需从头开始编写。
你的问题属于机器学习问题吗?
机器学习擅长对数据进行分类和标注。所有机器学习问题的前提都是:
- 有人给了我们一些根据某个秘密公式生成的数据。这些数据可能是一堆点(根据某个数学方程式生成),但也可能是一些有趣的东西,比如图像(秘密公式可能是“这些图像中有些是吉娃娃,有些是蓝莓松饼”)或公交时刻表。
- 通过分析我们得到的数据,我们可以推导出秘密公式,从而能够正确预测未来的数据点。例如,如果我们得到一张照片,最终就能自信地判断照片上是狗还是松饼。
一个有趣的演示!
如果你想入门,预测数字往往比预测图像更容易,所以在这个例子中,我们尝试将曲线拟合到一堆数据(这是TensorFlow网站上的同一个例子,但代码注释更多,图表更漂亮)。
我们得到一系列点(对于介于 -1 和 1 之间的 x,根据公式 y = a * x^3 + b * x^2 + c * x + d 计算 ay——我们知道这是秘密公式,但我们不知道 a、b、c、d 系数的具体值)。我们的目标是求出这些系数,这样,如果我们得到一个新的 x 值,我们就能知道对应的 y 值应该是多少。
蓝点代表我们得到的训练数据点。红点代表我们基于初始默认系数的猜测值(错得离谱!)。点击训练按钮后,绿点会显示系数的改进情况。看完默认示例后,不妨试试改变数据形状、减少数据点或迭代次数,看看会发生什么!
它长这样,你可以在这里玩玩!
工作原理
大多数机器学习算法都遵循这种模式:
- 我们必须找出生成给定数据的秘密公式的“特征”,以便学习它们。在我看来,这大约占解决机器学习问题复杂度的 80%。在这个例子中,我们被告知了秘密公式的形状(它是一个三次函数!),所以我们需要学习的特征就是多项式的系数。对于更复杂的问题,比如“这是狗还是蓝莓松饼”的问题,我们需要考虑像素、颜色、形状,以及是什么让狗成为狗而不是松饼。
- 一旦我们确定了这些特征(在本例中,就是系数 a、b、c、d),我们就将它们初始化为一些随机值。现在我们可以用它们来进行预测,但结果会非常糟糕,因为它们只是随机的。
- (从现在开始,我将只使用我们实际的例子,不再使用狗的例子。)
- 我们首先查看给定的每一段训练数据 (x, y)。我们取 x 值,并基于我们估计的系数预测 y 值。然后,我们查看原始训练数据中正确的 y 值,计算两者之间的差异,并调整系数,使预测值更接近正确值。
- (这种方法,加上一些数学知识,被称为“随机梯度下降法”。“随机”意味着概率性的,“梯度下降法”应该让你联想到从山坡上往下走,朝着一个塌陷坑走去——山坡越高,预测误差越大,这就是为什么你要朝着没有误差的坑走去。)
- 这部分代码其实相当混乱(因为涉及到矩阵和导数),而 TensorFlow 可以帮我们处理这个问题!
- 我们不断重复这个过程,直到用完所有数据,然后重复整个过程,一遍又一遍地迭代相同的数据,直到最后我们几乎完全了解了系数!
代码
你可以在 Glitch 上查看演示代码。我尽量为大部分代码行添加了注释,解释算法或 TensorFlow 的具体操作(尤其是 TensorFlow 在后台执行大量繁重运算的部分)。希望对你有所帮助!
原文发表于 meowni.ca。
文章来源:https://dev.to/notwaldorf/hello-tensorflow-2lc5
