最近的机器学习课上作业里要我们完成通过神经网络和逻辑回归进行手写数字的识别任务,神经网络的部分通过课上的辅助教材:
其中所提供的代码足以完成,另外这本书真的写的很好,在易读性与理解性上在我看来要胜过西瓜书,非常值得推荐!!
书中代码链接我也放在这里:https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network.py
当开始完成应用逻辑回归进行手写数字识别时,由于涉及到LogisticRegression的多分类问题,我在网上搜索了一些相关的代码进行学习与参考,以下是源代码:
https://www.jianshu.com/p/ecb908e7a2d7
由于此处代码所使用的数据集采用的是matlab的加载格式mat,而我们作业中限定的是书中代码所使用的数据集mnist.pkl.gz,起初我直接使用了书中的数据预处理部分代码如下:
但如果直接将书中的数据集处理方式代入简书里的代码时,会报矩阵乘法中矩阵维度不匹配的错误,刚开始我以为仅仅是源代码的问题,反复调整过矩阵相乘部分的代码,但仔细阅读简书中代码的数据处理时发现,它所使用的数据集是(5000,400),也就是一共有5000条数据,每条数据的维度为20*20,但有意思的是,如果我们print一下书中数据预处理后的结果时,我们会发现书中的代码居然是(50000,2),其中的2是由于经过了zip()函数处理,导致一部分是测试数据的inputs,另一部分则是测试数据的results,但实际上mnist.pkl数据维度应该是28*28=784,这里感觉是被数据预处理(x,x,...,x)整个视作一个维度了,但这样处理之后不符合我们简书中代码输入数据形式的要求。
针对这一点我痛苦了很久,一直在查找怎么将这一个维度打开的办法,在网上也搜索了很多资料,但是都无法进行将这一维度“打开”的办法,直到我在代码中进行了测试:
根据我前面的“瞎猜”,这里按道理也应该是(3,1)啊,但当矩阵维度很小时我才明白过来这怎么可能呢,这很显然是一个(3,3)的矩阵,于是我这里才明白过来,是书中代码的数据预处理部分进行了“多余的操作”!最终我发现问题出现在这个函数上:
这部分函数里把训练数据的输入和输出全部一维向量化,然后将它们用zip()函数组装之后传出来,但就是这一步操作让我们后面在print(train_data.shape)时总是提示我们这是个(50000,2)的矩阵,在数据处理中将这部分取消后再代入简书中代码即可成功运行。
但这里又有新的问题,简书中的数据维度仅为(5000,400),而我们书中的数据集则是(50000,784),逻辑回归又需要生成10个分类器来进行运算,代码运行时间过长,于是我将书中数据也仅取前5000个数据,新数据集维度为(5000,784),这样就能得到结果,最终结果为:
太感动了!!!!!没有辜负我这么多天的头疼,现在来看根本不是什么大问题呀,还是自己python的基础太薄弱导致的,在机器学习方面数学基础与理解固然重要,但我认为代码能力也非常重要,正如我们老师所说:“如果你上完我的课还只会调包,那我真的十分失败!”