12.0-多入多出三层-多变量非线性分类.md

Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可

第12章 多入多出的三层神经网络

12.0 多变量非线性多分类

12.0.1 提出问题

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

Mnist.png

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

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

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

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

图片数据归一化

在第5章中,我们学习了数据归一化,下面这段代码是第5章中使用的数据归一化方法:

def NormalizeData(X):
    X_NEW = np.zeros(X.shape)
    # get number of features
    n = X.shape[0]
    for i in range(n):
        x_row = X[i,:]
        x_max = np.max(x_row)
        x_min = np.min(x_row)
        if x_max != x_min:
            x_new = (x_row - x_min)/(x_max-x_min)
            X_NEW[i,:] = x_new
    return X_NEW

下面这段代码是第本章中使用的数据归一化方法:

    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

我们使用了不一样的归一化数据处理方法,这是为什么呢?

样本序号 1 2 3 4 ... 60000
点1 0 0 0 0 ... 0
点2 0 0 12 0 ... 59
点3 0 0 56 253 ... 98
点m 0 23 148 0 ... 0
点784 0 0 0 0 ... 0

也就是说,数据虽然分成多个特征值(行),但是每个特征的取值范围实际上都是[0,255]。假设有这样一种情况:

样本序号 1 2 3 4 ... 60000
点1 0 3 0 1 ... 0
点2 0 0 255 0 ... 59

假设第一行数据中的最大值为3,第二行数据中的最大值为255,如果逐行归一化的话,则3和255都会变成1。它们原本的含义是像素灰度,这样一来本来相差很远的两个数值,都变成1了,这不符合原始含义了。

代码位置

ch12, MnistDataReader.py

你可能感兴趣的:(12.0-多入多出三层-多变量非线性分类.md)