跳转至

第12章 多入多出的三层神经网络 - 深度非线性多分类⚓︎

12.0 多变量非线性多分类⚓︎

12.0.1 提出问题⚓︎

手写识别是人工智能的重要课题之一。MNIST数字手写体识别图片集,大家一定不陌生,下面就是一些样本。

图12-1 MNIST数据集样本示例

由于这是从欧美国家和地区收集的数据,从图中可以看出有几点和中国人的手写习惯不一样:

  • 数字2,下面多一个圈
  • 数字4,很多横线不出头
  • 数字6,上面是直的
  • 数字7,中间有个横杠

不过这些细节不影响咱们学习课程,正好还可以验证一下中国人的手写习惯是否能够被正确识别。

由于不是让我们识别26个英文字母或者3500多个常用汉字,所以问题还算是比较简单,不需要图像处理知识,也暂时不需要卷积神经网络的参与。咱们可以试试用一个三层的神经网络解决此问题,把每个图片的像素都当作一个向量来看,而不是作为点阵。

下载数据⚓︎

  1. 由于数据较大,所以没有直接放在 GitHub里,请读者自行从 http://yann.lecun.com/exdb/mnist/ 下载 4 个 .gz 文件,保存到一个临时目录中。

  2. 如果您使用的是 Linux 系统,用 gzip 解压文件即可。如果您使用的是 Windows 系统,从 https://gnuwin32.sourceforge.net/ 下载 gzip 应用程序后进行解压。

  3. 解压完成后,请在 "ch12-MultipleLayerNetwork\HelperClass2\" 目录下创建 data 目录,把上面四个解压好的文件拷贝到 data 目录中。

最后的文件路径是:

...\ch12-MultipleLayerNetwork\HelperClass2\data\
                                               \t10k-images-idx3-ubyte   # 测试图片数据
                                               \t10k-labels-idx1-ubyte   # 测试标签数据
                                               \train-images-idx3-ubyte  # 训练图片数据
                                               \train-labels-idx1-ubyte  # 训练标签数据

图片数据归一化⚓︎

在第5章中,我们学习了数据归一化,是针对数据的特征值做的处理,也就是针对样本数据的列做的处理。

本章中,要处理的对象是图片,需要把整张图片看作一个样本,因此使用下面这段代码做数据归一化方法:

    def __NormalizeData(self, XRawData):
        X_NEW = np.zeros(XRawData.shape)
        x_max = np.max(XRawData)
        x_min = np.min(XRawData)
        X_NEW = (XRawData - x_min)/(x_max-x_min)
        return X_NEW

代码位置⚓︎

ch12, MnistDataReader.py