Kaggle Digit Recognizer

code on github

就这个问题来说应该是被研究透了的(CNN)。可是在这个比赛中给出的train数据只有4w条,test数据有2w条,所以如何有效地使用这些数据才是关键。当然最后可以使用KNN和RF做ensemble,但是我觉得这题目价值还是接触CNN, 以及如何做data augmentation.

为了学习使用CNN, 我稍微浏览了一下现有开源的DL实现,cuda-convnet2, caffe, cxxnet, 基于theano的各种python封装都还挺不错的。我选择了文档清晰和实现比较优雅的caffe入手,做完题目之后也写了一篇关于caffe的 文档

因为数据量已经相对比较大(对于可以分离出单独的test case来说),所以可以分离出部分tests不用作training。又因为图像这个东西不太好理解特征,所以随机选择一些tests就足够了。这题目cross validation不是问题。并且实践也证明,使用随机选出的tests计算出的accuracy, 和LB给出的分数基本上一致。因此选择那些test accuracy比较高的model,分数也会高一些:)

感觉对于NN来说,网络结构以及训练方法不是太大的问题,最大的问题还是如何获得更多的数据。我现在只用了rotate操作来扩大数据集合(see caffe-prepare.py),如果可以引入一些其他操作的话,估计效果会更好。

note(dirlt @ 2015-04-17): 借用fzh师姐的一台GPU机器跑了CNN模型。我记得之前用caffe的CNN结果大约是0.99071,使用的数据集合是通过rotate增加了(-20, -16, ..20)这些角度的旋转,不过跑的轮数不太多。这个我稍微修改了一下 code ,使用streaming-input方式可以在线地对训练数据集合进行不同角度的旋转,尝试利用GPU多训练几轮,看看是否有改进提升(LB = 0.99371).