2020-07-12 blog

总算是把机器学习给讲了。

其实准备讲这次课,也算是自己梳理了一遍。


由于blog实在是做不到坚持每天都更新。所以我打算加到日程里面。

首先是加到TODO,设置提醒。

然后是打卡计划。创建一个专门打卡用的md。

计划养成的习惯:

  1. 每天写blog
  2. 每天看一次TODO
  3. 每天打开蚂蚁森林
  4. 9点洗澡,12点之前睡觉

DL笔记

成功复现Maxout Network、Network In Network和Batch-Normal Maxout Network In Network。

其中MIN的性能虽然不错,但是并没有达到论文中所说的Error 0.24%. 手里最好的记录也只是到0.34%.

不过其实也算是积累了一下经验和知识储备。

之后应该还需要把这些模型给收录到单独的模型集里面


Deep Go

历经波折,这个重写了无数遍的框架总算是有了一个正式的名字。

从最一开始立项做这个框架,到后面不断重写,也有一年多了。

第一版是hat1。那时候是刚开始做机器学习这一块。刚接触到keras,但是对keras并不够熟悉。而且当时我写python也没有自己的风格和规范,所以写得非常乱。

要动手做hat2,我也不记得是什么原因了。大概可能是因为新需求的提出,然后原来的框架因为太乱,索性干脆重构了吧。hat2的特点是已经有一定的代码方面的规范,但是也是有点乱来。当时提出了一个比较有意思的点,就是所有的数据集、模型,都是在一个文件夹里,然后用动态import的方式来调取,有“分包管理”的思路。另外,hat2也开始支持多gpu。

之后不出所料,也是因为太乱,所以重构又来了。hat3的特点是很突出的:1、有明确的代码规范,形成了文件;2、开始自己写训练逻辑,并且实现了获取训练中间数据;3、初步将模型、数据集与框架本体分离,只不过当时只是放到了app文件夹中。但是因为hat3编写的时候,没有接触到gpu服务器,所以当时没有做多gpu支持。

整个开发过程中,其实框架的部分也没有那么的重要。因为实验、测试比起框架的完善,优先级更高。当时提出了很多很有意思的Feature,但是很多都存在了TODO里面,没有真正实现。

下一代重构,不叫hat4。因为其实最一开始起名为hat,是为了用名字凑一个有“字典意思”的英文单词,然后就以Hust Artificial neural network Tools来命名了。但是到了4.0时代,我感觉这个名字不太对劲,所以当时以Neural Network Tools做名字,因此第四代的项目名为nnt。

nnt的特点也非常突出。首先,从这代开始,将自己本身定义为一个第三方包。也就是说,模型的训练等等,所有的实验等等,并不会放到框架内。这一点其实是受到了开发bwt时候的影响。

前面三代都会出现一个问题,通用的代码和特例代码的共存问题。一旦将实验的部分也放到框架内,势必会出现各种各样的兼容性的问题。于是,在最一开始还没跑数据的时候,框架是clean的。一旦开始出现某些数据不太兼容,必须手动进行处理的时候,就会引入各种修补。随着时间推移,就会变得很臃肿,混乱。

另外,nnt还有一个跟前面三代都不一样的点,那就是开始有“有层级”的设计。这是一个三层的框架。最底层是内核层,封装各种python、TensorFlow、Keras、Numpy等的方法,提供API,以及io等较为内核的部分。中层是框架层,定义和封装各种既不算内核,又不算应用,是基于内核,又为应用提供服务的东西。比方说Log模块,还有Config模块等,这些类或者功能本身并不是一个应用,并且他们也基于内核层。最顶层的自然就是应用层了,定义和封装的都是外部直接调用就能用的。比方说Trainer、Dataset等。

这么一层封装,其实也有一个巨大的好处。因为TensorFlow的智熄操作,使用LazyLoader的方式来加载函数,各种乱改包路径,导致VS Code无法正确得到tf的函数文档和函数输入等(即智能补全失效)。自己封装一遍,正好可以补上这些缺失的部分,在做实验的时候也非常方便。

但是呢,因为名字不好听(听着像 你脑瘫),所以决定改个更好的名字。想了很久,最终是决定使用Deep Go这个名字。

也就是说,Deep Go其实已经是4.1版本啦。

还特意做了一个还算ok的README。如果有机会的话,给Deep Go设计一个logo就更好了。

目前,Deep Go的底层其实已经写了大部分了,框架层和应用层也在慢慢补充。按照之前的开发阶段预估来说的话,也就是说alpha版本其实已经算是达到了,下一个阶段就应该是beta了。

但是我感觉可以先再补充一点东西,然后再去release也不迟。


目前大部分的API其实都已经写得差不多了,就是后续还有需要的话再慢慢补充。

接下来的开发,主要是加上Plugin,让Trainer具有拓展性。然后是开发记录中间数据的Plugin以及Ctrl C结束的Plugin。

完成这一步之后,就可以开始做View的部分了。

TODO:添加一个api,动态分配显存。

TODO:在layer添加优化器和规则器。

TODO:检查keras Layer的doc string有没有更新


这个blog转到web的项目也得加快立项去做了。

因为现在网站的web文件夹已经同步到笔记本了,所以只需要本地generate然后把public复制过去就可以了。

路径配置我也已经想好了,就用json就行了。

可能关键点就在于怎么处理这个blog变成blog。


今天主要是尝试了一下用surface go装上deepgo的环境。

不装不知道,原来坑挺多的。不过还好折腾了一番之后,总算是能用上了。

You may also like...

发表评论

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