结果如下:
Epoch 0: 790 / 10000 Epoch 1: 846 / 10000 Epoch 2: 854 / 10000 Epoch 3: 904 / 10000 Epoch 4: 944 / 10000 Epoch 5: 975 / 10000 Epoch 6: 975 / 10000 Epoch 7: 975 / 10000 Epoch 8: 975 / 10000 Epoch 9: 974 / 10000 Epoch 10: 974 / 10000 Epoch 11: 974 / 10000 Epoch 12: 974 / 10000 Epoch 13: 974 / 10000 Epoch 14: 974 / 10000 Epoch 15: 974 / 10000 Epoch 16: 974 / 10000 Epoch 17: 974 / 10000 Epoch 18: 974 / 10000 Epoch 19: 976 / 10000 Epoch 20: 979 / 10000 Epoch 21: 981 / 10000 Epoch 22: 1004 / 10000 Epoch 23: 1157 / 10000 Epoch 24: 1275 / 10000 Epoch 25: 1323 / 10000 Epoch 26: 1369 / 10000 Epoch 27: 1403 / 10000 Epoch 28: 1429 / 10000 Epoch 29: 1451 / 10000呃,发现准确率同样低得不忍直视。但是有一个优点,准确率是稳步提升的。说明模型在大方向上应该还是对的。如果在调试模型的时候忽视了这个细节,你可能真的找不到合适的参数。
可见,我们第一次尝试的神经网络结构的超参数设定还是比较不错的。但是真实的应用场景中,基本没有这样好的运气,很可能刚开始测试出来的结果全是奇葩生物,长得违反常理,就像来自另一个次元似的。这是数据挖掘工程师常见的情况。此时最应该做的,就是遏制住心中数万草泥马的咆哮奔腾,静静地观察测试结果的分布规律,尝试找到些原因,再继续将模型试着调优下去,与此同时,做好从一个坑跳入下一个坑的心理准备。当然,在机器学习工程师前赴后继的填坑过程中,还是总结出了一些调优规律。我们会在接下来专门写博文分析。
当然,以上的调优都没有逃出神经网络模型本身的范围。但是可不可能其他的模型效果更好?比如传说中的支持向量机?关于支持向量机的解读已经超越了本文的篇幅,我们也考虑专门撰写博文分析。但是在这里我们只是引用一下在scikit-learn中提供好的接口,底层是用性能更好的C语言封装的著名的LIBSVM。
相关代码也在Michael Nielsen的文件中。直接引入,并运行一个方法即可。
import mnist_svm mnist_svm.svm_baseline()我们看看结果:
Baseline classifier using an SVM. 9435 of 10000 values correct.94.35%,好像比我们的神经网络低一点啊。看来我们的神经网络模型还是更优秀一些?
然而,实际情况并非如此。因为我们用的只是scikit-learn给支持向量机的设好的默认参数。支持向量机同样有一大堆可调的超参数,以提升模型的效果。 跟据 Andreas Mueller的这篇博文,调整好超参数的支持向量机能够达到98.5%的准确度!比我们刚才最好的神经网络提高了1.8个百分点!
然而,故事并没有结束。2013年,通过深度神经网络,研究者可以达到99.79%的准确度!而且,他们并没有运用很多高深的技术。很多技术在我们接下来的博文中都可以继续介绍。
所以,从目前的准确度来看:
简单的支持向量机<浅层神经网络<调优的支持向量机<深度神经网络
但还是要提醒一下,炫酷的算法固然重要,但是良好的数据集有时候比算法更重要。Michael Nielsen专门写了一个公式来来表达他们的关系:
精致的算法 ≤ 简单的算法 + 良好的训练数据
sophisticated algorithm ≤ simple learning algorithm + good training data.
所以为了调优模型,往往要溯源到数据本身,好的数据真的会有好的结果。
8、小结与下期预告以上我们只是粗略地展示了用神经网络分析问题的基本过程,很多深入的内容并没有展开。我们将会在接下来的博文中进行深入探讨。
在该系列下一篇博文中,我们试图直接探讨深度神经网络的表现能力,并提供一个启发式理解。敬请关注。
顶 0 踩 0
我的同类文章
猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
个人资料
yaoqiang2011