自己有幸参加了GLCC开源夏令营,并得到了参加由Amazon公开的Deep Java Library开源项目的机会,自己负责的Project是DJL-Zero,该项目旨在帮助没有机器学习或许深度学习相关经历的Java开发者们能够很方便地练习出自己的深度学习模型。在该文中以周为单位总结概括自己项目中学习到的相关常识。

第一周(或许说正式工作的第一周)

作为深度学习的newbee,第一周(之前也有2周了解了)的主要使命便是了解DJL环境,而且对ImageClassification Class进行修正——现在ImageClassification中的train办法关于每个输入的dataset样例,train办法都会练习一个ResNet作为模型输出,而导师以为关于那些Small and fast的情况,能够练习一个MobileNet。然后问题主要便是:DJL的ModelZoo当中并没有MobileNet。因而我完成了一个MobileNetV1,然后成功提交PR合入了代码仓库。PR地址:Add MobileNetV1 into modelZoo and add corresponding test class MobileNetV1Test by warthecatalyst Pull Request #1817 deepjavalibrary/djl (github.com)

遇到的一些应战

  • 首要最大的应战便是作为深度学习几乎0基础的学生(至少没有过代码经历),从0开始在DJL结构里边建立一个MobileNet也算是第一个应战
  • 第二个问题便是跟自己平常写的trash项目不一样,代码中需求恪守的标准非常多。我建立完之后花了一个下午的时刻修正代码以及JavaDoc和注释等内容,项目中的命名标准、各种类成员变量和办法等等都需求恪守一定的标准。比如PR1815也是我的,因为代码没有经过测验因而没有被合入。
  • 第三个问题便是不太会用git,这儿引荐一个学习git branching的神器:Learn Git Branching

第二周

这周主要是被自己的导师gank了,他的横向项目好长时刻没发展,然后我又是负责人,所以花了2天搞导师的项目。
这周在DJL方面的发展主要便是Build MobileNetV2,跟MobileNetV1不同的当地在于,MobileNetV2运用了ResNet中的残差网路结构,因而这周build的难点在于怎么在DJL中建立残差网络。在DJL中供给了ParallelBlock,因而当遇到残差块时,我只需求build一个parallel block即可。在JavaDoc(青总)的帮助下,我知道了如安在最终一层运用conv1*1(因为之前遇到了Shape Unmatch)的问题。可是一点小问题是在运转trainer.steo()时报错了,可是先提交了一个PR可能让DJL的大佬们看看就知道哪里呈现了问题。
PR地址:Add MobileNetV2 into ModelZoo and corresponding Test Class MobileNetV… by warthecatalyst Pull Request #1847 deepjavalibrary/djl (github.com)

以及在Amazon供给的服务器上train了一下MobileNetV1 Model,最开始对他们的环境瞎搞导致他们环境直接崩溃了…然后第2次的时分吸取教训运用docker来进行练习,感觉效果挺好:

GLCC/Amazon 扩展DJL-零项目经历

第三-第四周

第三-第四周双线程了,参加了字节的夏令营机器人小组,不小心拿了个二等奖… 然后主要是完成了MobileNetV2构建的完结,以及MobileNetV1和MobileNetV2的练习,一个bug 有好多天以为是自己的问题,效果之后调用./gradlew clean就然后就成了。 两周的PR效果:Training of MobileNetV1 and MobileNetV2 on Mnist and Cifar10 by warthecatalyst Pull Request #1878 deepjavalibrary/djl (github.com)

最终效果

最终,为期12周的GLCC_DJL项目也是圆满结束了。中心这个理应每周一次的记载环节也是没有按期进行(俗话说方案赶不上改变)。但在12周的过程中我觉得我也是完结了不少的使命:在整个扩展DJL-零项目中,我的使命主要分为三个模块:Image Classification、Object Detection和Tabular Prediction。

Image Classification

这一块内容基本上Zach现已完结了,可是Zach以为DJL现在缺少一些小而快的模型,因而,在DJL中加入了MobileNetV1和MobileNetV2模型。MobileNetV1和MobileNetV2模型本身在此就不过多赘述了。其运用方式能够检查DJL-Zero中Image Classification的Train办法。代码如下所示:

block = MobileNetV2.builder().setOutSize(classes.size()).build();

Object Detection

关于目标检测,这一块的内容并没有彻底完结。现在确认完结的部分有yolov3的model。然后Yolov3Loss现在还存在一点问题,关于某些数据集(实际上我就成功了一个TrainPikachu),会呈现loss becomes NAN的问题,而且现在只有Pytorch Engine是能够运用的,MXNet会遇到shape inconsistent的bug。

如果有兴趣持续研讨的,也欢迎在我的基础上再改动一些内容,或许在DJL中完成Yolov5等更高档的目标检测模型。

TabNet

关于表格数据,深度学习却一向没有照顾到这个拥有真实国际80%数据格式的范畴。直到Google的AI research team宣布了关于TabNet模型。TabNet的网络架构在此处也不赘述,直接阐述如何运用。

类似于DJL-Zero的部分,TabNet模型的构造十分简略。设置好输入参数和输出参数(别离是TabularDataset的featureSize和labelSize),然后能够选择性设置numShared和numIndependent,别离代表TabNet论文中的分享层数目和独立层数目。最终build()即可。

// for fast cases, we set the number of independent layers and shared layers lower
block =
        TabNet.builder()
                .setInputDim(featureSize)
                .setOutDim(labelSize)
                .optNumIndependent(1)
                .optNumShared(1)
                .build();

针对不同的表格学习使命(回归使命和分类使命),界说了不同的LossFunction,别离为TabNetRegressionLoss和TabNetClassificationLoss,以供用户运用。