对于像我这样初学机器学习算法的小白而言,手写数字分类是一个很不错的小实践。手写数字可以利用很多机器学习的算法进行分类,例如朴素贝叶斯、支持向量机、随机森林等等算法,由于笔者最近在学习神经网络,所以在此利用最简单的单个神经元模型(Softmax Regression)进行手写数字分类。
首先加载需要用到的库和数据。
加载完需要的数据之后,可以打印数据的相关信息,也可以看看手写数字的样子,在这里需要提到一下one_hot编码,读者可以自行百度,在此不赘述了。
输入数据的shape: (55000, 784)
可以看到该数据集里面有55000张图片,每张图片就是1行784列(28×28)的数据,每个数据点表示一个像素,由于数据量过大,所以不再展示,上述被注释的代码可以实现,有兴趣的读者可以自己去运行看看。
实际上MNIST数据集分成三类,训练集,测试集和验证集,下面的代码将会用到。在模型建立之前,需要定义相关变量和相应的模型参数设置。
上述代码为相应的变量定义和参数设置,读者也可以修改,优化器也可以使用其他优化器,关于优化器的种类和用法读者也可以自行查阅。关于各种交叉熵,笔者目前也不是太懂,还需下去学习,读者也可以自行修炼,领悟其使用方法以便自己可以熟练运用,在做好上述准备之后,下面就到了关键环节了,运行模型。
上述代码是笔者自己编写的一个函数,用于计算准确率,当然可能有点班门弄斧了,其实TensorFlow里面有相应的计算准确率的函数,读者可以自己去慢慢探索。
上面的代码就是运行模型的代码,中间的输出读者也可以根据自己的需要去相应的进行设置,下面来看看输出结果。
从上述结果可以看到,迭代到41次的时候已经达到了比较好的效果。下面将模型运行中的损失和测试准确率可视化。
从上面的图中可以看出,在训练过程中,损失逐渐下降,但在测试的时候,会出现震荡的情况,这在神经网络模型中会经常遇到,不过整体来看,模型的效果已经不错了,测试的准确率达到了90%以上。在得到了模型之后,可能读者也会迫不及待的想要应用了吧,哈哈,其实我也一样,下面就来应用一下模型吧。
运行上述代码,可以获得验证集的预测准确率,为了更形象的展示出来预测效果,画出混淆矩阵,下面来看看具体结果。
预测准确率为: 0.9116
上面的结果显示预测的准确率达到了91.16%,还是不错的,混淆矩阵里面也显示了具体的预测结果,横坐标代表预测值,纵坐标代表实际值,例如第1行第3列的数字5表示原始标签为0结果被错误预测为2,这样的错误情况出现了5次,其他的结果读者可以自己看看。
关于softmax做手写数字分类的做法就介绍到这里了,咱们下次再会。
领取专属 10元无门槛券
私享最新 技术干货