机器学习编程:从编码到深度学习
上QQ阅读APP看书,第一时间看更新

6.2.1 准备输入矩阵

二元分类器程序期望将输入的样本数据格式化为两个矩阵,一个是表示样本数据的矩阵X,另外一个是表示标签值的矩阵Y。让我们从矩阵X开始。

矩阵X中的每行元素代表一个样本数据,每列元素代表一个输入变量,其中有一个列输入变量是偏置列,就是取值全部为1的那一列(还记得偏置列吗?我们在4.4节中谈论过)。

为了使MNIST中的图像数据符合这种格式,我们可以将每个图像重新格式化为一行像素,这样每个像素就成为一个输入变量。MNIST图像有28×28个像素,因此会产生包含784个元素的行。再加上偏置列,每个图像样本的数据最终是一个包含785个元素的行。这就是矩阵X的样子,一个由60 000行(样本的数量)和785列(每个像素为1列,加上偏置项1列)组成的矩阵,如下图所示。

我们才刚刚解决了一个带有三四个输入变量的应用问题,现在就需要解决一个包含成千上万个样本和成百上千个输入变量的图像识别问题了!

现在我们来处理标签矩阵Y。这个矩阵乍一看比图像矩阵还简单,每个样本仍然是一行,但只有一列包含标签值。然而,这里还有一个额外的困难:我们至今只构建了二元分类器,它期望标签是0或1。相比之下,MNIST的标签从0到9不等。如何在0或1中放入10个不同的标签值呢?

我们可以使用缩小范围的方式来解决这个问题,从识别某个特定的数字开始,比如数字5。由于可以将一个数字分为两类,即“不是5”和“是5”,这还是一个二元分类的问题。

信仰之跃

在上面,我们分别将每个MNIST图像压缩到X矩阵的一行之中。你可能会对这个想法感到费解。我们不是在摧毁这些图像吗?如果把手写数字压缩为毫无意义的像素行,又有什么意义呢?

实际上,我们在这里进行了一个信仰之跃:相信统计的力量。尽管这些数字的几何形状已经丢失,但我们确信使用这些数字的像素分布就足以实现对它们的识别。例如,数字7中的中心像素可能比数字0中的中心像素更暗。单个像素的亮度可能是一种非常微弱的暗示,但通过将这些微弱的暗示累加起来,我们希望能够得到被考察数字的线索。

这种查看单一像素的方法在处理比MNIST更为复杂的数据时可能会遭遇失败。例如,设想编写一个分类器,可以从大象的图片中识别出大象的种类。当它们没有在泥里打转时,大多数大象看起来都是灰色的,因此分类器可能需要比像素灰度级更多的颜色来完成它的工作。在本书的最后(第19章),我们将描述一个更加强大的图像识别算法,一个可以关注由多个像素组成的几何形状的算法。

这就意味着我们应该将所有除了5之外的MNIST标签转换为0,并将5转换为1,矩阵Y如下图所示:

现在我们知道了该如何构建矩阵X和Y,那就将这个设计转换为代码吧。