神经网络——手写数字识别

这段时间,事很多,心很烦。小编已到杭州三天,学习状态不是很好,学习断断续续,但还是要总结下。


这一个星期都有在断断续续学习神经网络,觉得神经网络还蛮高大上的,有点高深莫测。


神经网络之所以叫神经网络是因为这个思想来源于人脑处理信息的过程。人脑中有很多很多的神经元,每一个神经元相当于一个计算单位,所有的神经元构成一个网络,可以处理复杂的信息。


一个简单的、典型的神经网络架构如下。




神经网络不仅可以作用在分类上,也可以作用在回归上。本次仅以手写数字的识别为例介绍神经网络的分类作用。


寄邮件都要手写邮编,在邮局运送邮件的时候都要识别由数字构成的邮编号码。本次神经网络的目的就是自动识别手写的邮编。


第一步:加载训练数据集。


本次的训练数据是由大量20*20的图像像素构成,图像都是手写数字的灰度图。如下所示。




加载数据集的Python代码如下:


# 读取以MATLAB矩阵存储的图片像素数据集
data = sio.loadmat('data.mat')
X_mat = data['X']
y_mat = data['y']
y = y_mat.reshape([1, 5000])[0]

第二步:数据整理。


数据整理的步骤为标准化数据和将数据集随机分成训练集和测试集。代码如下:


# 对数据的训练集进行标准化
ss = StandardScaler()
x_regular = ss.fit_transform(X_mat)

# 随机分为训练集(4500)和测试集(500)
x_train, x_test, y_train, y_test = train_test_split(x_regular, y, test_size=0.1)


第三步:训练数据。


如果要自己从头实现神经网络训练数据的算法是比较有难度的,本次小编是采用了sklearn的包,只需下面两段代码即可。


clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(i,), random_state=1)
clf.fit(x_train, y_train)

到此一个简单的神经网络就已经训练好了,你只要把要识别的数字图像像素信息传递给神经网络,它便能给出它识别的数字。


为了探索隐藏层中的结点数的多少对识别率的影响,有如下一段代码。


'''
对比隐藏层的结点数不同带来的识别率
'''
def result_by_haddin():
    scores = []
    xlable = []
    for i in range(5, 100, 5):
        clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(i,), random_state=1)
        clf.fit(x_train, y_train)
        r = clf.score(x_test, y_test)
        print(r)
        scores.append(r)
        xlable.append(i)
    plt.plot(xlable, scores)
    plt.title('score change by the neuron numbers of hidden layer')
    plt.show()


绘制出如下一幅图。



大致来说,结点数越多,识别率较高。为什么会出现上下波动的情况呢,我猜想要是能做交叉验证就可能好一点。


好了,本次的内容就到这里了,码字不易,请多多点赞哦。





猜你喜欢

转载自blog.csdn.net/qq_30374549/article/details/80890607