机器学习

本学期上了一学期的机器学习课,虽然并没有什么大的长进,但是毕竟做了(面向Github)两个大作业,学了半天,也应该稍微总结一下。菜得很,勿喷。

  • 个人大作业–猫狗大战图片分类

这个作业是Kaggle上的一个竞赛,通过对于猫狗图片数据集的学习,最终训练好分类器,分类猫狗两类。其实老师一共提供了四个课题,因为这个可能是神经网络跑起来最简单,所以我直接选择了这个,但是要说难易度可能还不是最简单的。
首先老师提供了4000张猫和4000张狗的图片作为训练集,2000张未标注的猫狗混合图片作为测试集,最终和Kaggle一样提交submission.csv文件来进行打分。其实在Kaggle的竞赛中,猫狗图片应该是各12500张,一共25000张的训练集,这里事实上是“阉割”了。
话不多说,首先我从Github上直接找到了一个自己搭建的小网络(Tensorlfow搭建)准备对于训练集直接进行训练。最开始我还是很实诚的用了老师的8000张数据集进行训练,但是发现效果最好也就66%的正确率就开始过拟合了,其主要现象是在训练集上的精度到了100%,但是测试集并没有提高。这说明训练数据集太小了,没怎么训就过拟合,因此下载了一份Kaggle上完整的25000张数据集进行训练,以期待能够解决这个问题,得到更好的结果。
在进行了一段时间训练后,发现依然过拟合。但是此时的效果已经好多了,能够达到77%左右的正确率。这时兴奋的我打开了榜,发现大家都是99%以上的正确率。Emmm,好吧,可能是小网络还是太菜了,要不我用一下现在主流的网络试试?因此修改了之前的小网络为VGG-16,发现跑不动,一直Loss不变化,估计是什么地方Tensorflow写错了。
绝望的我想起了Pretrain的VGG-16,问了一下同学们好像都用的是Imagenet上身经百战的网络参数,因此我也打算死马当活马医,试试吧。于是我调用了之前实习弄得Imagenet上Pretrain的VGG-16和Resnet-50,惊讶的发现的确管用,虽然1000类别最后预测出来的东西有一部分会把猫认为是假发,但是绝大多数居然真的能够预测。在这种办法下,我把猫的细分类全部归类为猫,狗的细分类归类为狗,最终没有包括的随机分类,得到了93%的正确率。
但是这依旧很菜。我开始思考99%是怎么做出来的,仔细想想其实我用上述方法和finetune的原理基本上是一样的,那么如果我能够对于Pretrain的模型直接进行finetune比我手动搞不是要强很多么?反应过来的我立刻进入Github,搜了一份finetune的代码,进行了几个小时的finetune,最终得到了97%的正确率。
同学在使用相同办法进行finetune的时候,改变了一些诸如Batchsize之类的参数,最终可以达到98%以上的正确率,虽然还没到99%但是应该也算是不错的结果了。如果能够用上集成学习的方法,可能正确率还要更高一些?不得而知。
题外话,这里有一个小Bug,如果你有足够的时间可以把两千张图片直接眼看出来,估计两小时之内就可以得到所有测试集标签进行提交,那正确率就是100%,虽然很无耻,但是为了完成任务倒是可以那么干。

  • 团体大作业–情感分析(Sentiment Analysis)

首先我觉得这个作业实在是没做啥东西,思路也挺混乱的,但是出奇的是居然最后跑出来的结果还不错…
这个作业就是给你一个电影评价的数据集,其中包括正面和负面情感两种标签,要求训练分类器,能够将测试集中未分类的标签分类为正面或者负面。可以认为这个任务是一个NLP任务,也可以认为其就是一个简单的分类任务。同样这也是一个Kaggle上的竞赛,那么不出所料我继续从Github上找源码,从Kaggle上下载完整数据集。
最开始使用的是朴素贝叶斯方法,效果不太好,大概83%,之后试了试SVM,87%的正确。看着榜上95%+的正确率的确有些纳闷,难道他们都找了LSTM来NLP不成?之后上Kaggle查了查,发现其实Kaggle上边也有不少现成的程序代码,拿过来跑了一个LogitsticRegression逻辑回归,居然到了93%的正确率??反正我是没弄明白LR和SVM根本上哪里不同,可能是预处理的区别,LR最终使用到了字母级别的特征,而SVM只使用了最基本的单词级别的特征。
这个大作业里,我还是学到了一些关于NLP的知识,比如TFIDF、GOOGLE的新闻向量数据、线性SVM。争取如果还有机会能再涉及这方面的东西,可以好好学习一下,虽然我对这个并不是很感兴趣。

发表评论

电子邮件地址不会被公开。 必填项已用*标注