@cleardusk
2015-12-04T22:12:14.000000Z
字数 2948
阅读 1868
GjzCV
这周有点不务正业。
第一天下午看了点数学,晚上 caffe;第二天 caffe,有所获;第三天 ImageNet;第四天图书馆没占到位置,回宿舍看了一天剧,晚上心里过意不去开始看 Deep Learning 中的 ML 部分;第五天 Deep Learning 这本书中的 ML 部分,及概率论与数理统计,PRML,晚上玩 Python;第六天,用 Python 设计爬虫,对教务处的网站下手,设计验证码识别的算法;第七天,玩了一天 matlab,写报告。
干的事看起来不大相关,实则有很强的因果关系。
caffe 本是作为本周的主线的,但今日一回顾这周的历程,似乎主线被跑偏了,看看自己是如何跑偏的。11 月 29 号和 30 号,我分别写了两篇简略的笔记。29 号我给自己下了个目标:会定义 model,会修改并适应自己的 model,会认识到 caffe 的局限性,会用各种框架或者自己写框架(自己写框架有没有意义?靠个人和靠团队?)。接下来,我继续熟悉 caffe 整个工程,分析整个工程的结构;对 caffe 官网上的 Documentation,Examples 进行地毯式的浏览阅读,提一点,调用 caffe 有三个 interfac,CLI, Python, Matlab,我跑 demo 用的是 CLI(命令行),Python 我测试了下,少了个库装一下 OK,Matlab 我还没测试。最后总结出,这里是解剖 caffe 的最佳切入点,这里面的超链接涉及到 caffe 的抽象结构(Nets, Layers, Blobs 等),比较好的阅读资料等。我对照着 lenet_train_test.prototxt 等 net 定义文件和 caffe.proto 以及 protobuf 的文档仔细研究,发现 caffe.proto 虽然基本描述了很多参数,但不是完备de网络结构涉及到的所有参数,但不是完备的,即通过 caffe.ptoto 不能推导出 train.proto 中所有的细节,还需要结合源码。最后,还可以浏览 caffe 工程的早期分支(比如两年前 Yangqing submit 的版本,源码文件才十几个),促进对 caffe 整个工程的理解。以上三点,我认为自己已经找到了合适的姿势去 hack caffe 了。
但是,我又写了一篇笔记,大概内容如下:
遇到的困惑。
我想,虽然,凭借特定材料,发挥了聪明才智的 hack,不懈的努力,我可以将 caffe 理解的很透彻;但是,我脑子里除了简单的多层网络模型,ConvNet 外,就没有了模型,亲娘的(来自武林外传 邢捕头的经典台词),这可怎么验证"从简单的网络模型写起"的假设,而且这样并不利于后期的分析,太急功近利的攻 caffe 也会让自己心浮气躁。这时候,我决定先看看 linear regression 等传统的 ML 模型,先探索一番,至于它们能不能用 caffe 写,我想就算不能用 caffe,python 肯定有相关的库。最终目标虽然是搞定 caffe,但是搞定 caffe 只是为了更好的建模分析,当做工具而已,空有工具二不知道去哪发挥作用,不好。在这两者间找一个平衡,那就是先看看传统的东西!
我是做了一个假设,学习应该从基础的学起,比如 caffe,学会先写简单的网络,搞定碰到的细节(坑)后,碰到复杂点的网络也能灵活运用了,这样的话,看到文献上模型,要能很快的进行实现。
但是,我发现 ImageNet 的 demo 还没跑,我得先跑一下。结果入了坑。
caffe 没有提供 ImageNet 的数据下载,我就去 ImageNet 的官网看了看。关于 ImageNet 的下载方法、分类结构,我写了三篇笔记。下载的话,核心是 wnid(worldnet id),图片分类的类别号;分类结构的话,主要是通过一个 wnid-wnid 这种 parent-child 结构的文件文本文件来描述的,也可以理解为图结构,parent-child 就是一条边。我打算下载,我用学校的邮箱注册,申请了四次才成功,获得了下载的权限,不注册的话,可以通过 url.txt 下载,但是,这么多链接难免有一部分会有失效的。我打算下载的是 ILSVCR2012 的数据,我有下载完整包的权限,但是我怕不稳定,我在 Linux 下也没有迅雷这种下载神器,最后写了几个 bash 脚本下载。核心脚本在这,当然,我把用户名和秘钥信息去掉了。
每天挂夜下载,已经下了 50 多 G。所以说是个坑,但我觉得下载挺好玩的,每天有时间会改进一下下载的脚本。最近发现,用 Python 其实更方便,用 Python 我还能统计整个 ImageNet 公开的数据库大小,这个我还没写,我估计是 1.5~2 个 T。
所以说这是个坑,我的电脑肯定跑不动。
接着我看 ML 部分去了。看了不少,很有收获,但我还没花时间总结。我很简略地说一下,我所接触的 NN 中的很多词在 ML 中已经有的,一个很有意思的理论是 The No Free Lunch Theorem,结论是 ML 算法是不能达到 generalization 的,ML 算法只对特定的 task 表现的好。不过这一点似乎正在被 DL 改善。看数理统计部分时,发现其实遇到的很多问题都与数理统计有关,比如我在预估 ImageNet 整个数据库大小的时候,我是选取下载的一部分 images,统计这一部分的大小,从而估计整个数据库(图片数目已知)的大小,这样估计误差会多大?我选取的样本应该多大?还有我在爬教务处的验证码时,我得验证它是静态的还是动态的,如果我只下载 100 张(样本),每张的 sha 值都不一样,我就能判断它是动态生成的麽?扯远一点,在物理中,除了万有引力的理论,其余所有的理论都可以用量子力学的一个式子表示,也就是说,这个式子可以几乎可以解释显示中所有的现象(除了万有引力)。量子力学的研究是用到了概率的理论,足以可见概率与事物息息相关。对于数据,只要数据量稍大点,就必然会与概率与数理统计打交道。
本是想用 Python 来改进 ImageNet 的下载的,结果发现用 urllib, urllib2 比较简单也就懒得写了,当时正在查成绩,需要输入验证码,就想着能不能自动把成绩的 page 给爬下来。用 matlab 捣鼓了一整天,核心待码有二,一是写的简易的打码器,就是人工给验证码打 label,运行后只要输入数字就行,程序会将图片切割,并把 label 存入(我选择的是)文件名中,当然,要保证文件名不重复或者很小的概率重复(涉及到了概率),我打码比较慢,100 个要 240 s,原因一是笔记本键盘不给力,二是程序可以改进,程序应当在输入的字符数目达到 4 时,就完成分割打标签工作,但我目前的版本还需要输入回车,这样会费时些。我挂了一晚上,爬了 10 万张验证码。
结果,发现干扰线不用删除就能很好的识别(大概 100% 吧)。根据The No Free Lunch Theorem ,特定的 task 可以工作的很好。只能说,教务处的验证码很 low,识别属于最易级别的。我搞这个,本意是想接触一些图像处理和 ML 相关的基础知识,当然,最后也没怎么用上。我用 matlab 做了个 gif(随机 100 张生成的),如下,权当玩耍一下。核心代码在这(函数部分我没贴)。
这周的经历前后还是有因果关系的。时间仓促,此次报告写这么多吧。