机器学习中的“hello world!”
就像我们学习编程语言一样,我们的第一个尝试就是在终端命令行中输出的 “Hello World”。机器学习中的 “Hello World” 便是识别手写字数据集。
想想在得到一张手写数字图片的数据之后如何分析出正确的数字?
keras-js的实际demo
数据的表示和收集
图片其实放大来看其实就是一个个像素点,对于黑白图像,每个像素点就只有黑白两种颜色以及黑白深度的区别,怎样用一种程序的方式来表达一张白底黑字的图像的像素点分布以及它的黑白深度呢?
如何将一张图转化成深度矩阵的格式是图像识别要做的,这是另一个广泛的课题,这里不展开。
我们直接使用MNIST的数据集,它的数据表示方式正如上面所描述的那样,只是 MNIST 数据集中每一张图片是包含 28 * 28 个像素点的。
确定了数据的表示方式,接下来我们还需要对每个数据的实际含义进行标识。
回想一下我们自己是如何认识这些数字的?即我们是怎样认定图像中的 1 形状表示的就是数字 1?————事物的认识。认知是由他人(数学老师教的,告诉我们这样是1,这样是2)教育的。
为了收集训练数据,我们可以随机找人在手写识别程序中画数字,然后标识它的结果,最终以任何的形式(文本、表格…)储存。以手写字为例,我们可以用文本的方式存储,格式可以是这样:
0 0 0.3 0 1 0 ... n(=28) | 4
1 0 0.1 0 0 0 ... n(=28) | 6
....
n(=1000)
其中每一行代表一个训练数据(一个MNIST数据,有多少行表示有多少个数据),使用 “|” 分割数据的表示和它对应的数字。
在本文中我们将直接使用 MNIST 数据集,因此如何收集数据在这里不再展开。在机器学习中经常会使用公开的数据集来进行训练和测试。
通过确定数据的表示和收集,我们可以了解到的是:
+ 数据是一切机器学习的基础;
+ 训练数据的好坏将会影响到我们机器学习算法预测的准确率:
+ 想象一下如果某些数据我们标识错误,把 1 标识成 2;
+ 想象一下如果训练数据中有大量的重复值,或某个数字的数据量特别大而另外一些数字的数据量很小。
准备数据
我们收集到的数据可能会以任何的一种形式存储,例如文本、表格、二进制文件等等。MNIST 数据集是使用二进制存储的,因此在程序中我们需要将它转换为 Javascript 比较容易操作的的数据格式,例如数组。
本文中我们将使用一个 NPM 包 mnist 提供的,已经转换好的数据,它的格式如下:
[
{
input: [0, 0.4, 0.5