怎样高效阅读一份深度学习项目代码?

犹豫很久要不要把读代码这个事情专门挑出来写成一篇推文。毕竟读代码嘛,大家可能都会读。而且笔者个人读的和写的代码量也并不足以到指导大家读代码的程度。但笔者还是决定大胆地写一点:就当是给自己设立今后读代码的标准,也将一些之前未能践行的方法给写下来供大家参考。不当之处,还请各位指教。

搞深度学习的人,两大必备日常除了读论文之外就是读代码。读论文笔者在第4问的时候讲了阅读路线,但如何读用什么技巧读每个人都有不同的见解,这里不多说。读代码跟读论文、读书多少有相似的地方,毕竟都是读的性质。但话又说回来,读代码又跟读paper读书大有不同,代码是一种将论文中的模型和算法进行实现的过程,是一种需要你思维时刻在线的过程。又因为我们读的是深度学习项目代码,不是像Linux内核代码那样的鸿篇巨制,所以在代码性质上多少又有些不同。

笔者这里说的一份深度学习项目代码,小到几百行的测试demo,大到成千万行的开源项目,读起来方法肯定各有不同。如下图Mask R-CNN项目代码和PyTorch源码的对比:

可以看到,Mask R-CNN作为一个经典的实例分割框架,其代码量可以说是中规中矩,3k的代码量在我们读完论文后集中花几天时间差不多可以过一遍。但PyTorch的源码对大多数人而言就不那么友善了,750k的代码量,而且底层的C++代码占到整个项目中的一半之多,作为深度学习研究而言,堪称巨无霸级别了。这样的代码量,就像初学者拿到一本PRML,往往投入巨大精力后不了了之。所以,对于这两种类型的项目代码,阅读方法肯定会有所区别。

因为我们读代码的目的、场景和对象不尽相同,下面笔者从三个方面来和大家探讨如何阅读一份深度学习项目代码。

首先读代码的一些通用方法。这一点而言不局限于深度学习项目代码,任何项目、任何语言的代码阅读都适用。我们日常读代码无非是两个工具,一是将代码下载到本地,打开IDLE,在IDLE里安静的阅读:

第二个就是直接在GitHub的web端直接阅读,但GitHub没有像编辑器那样在左侧设置阅读目录,每次进入一个代码文件就必须退出来才能进入另一个文件,用户体验极差。当然了,这都不是事。chrome给我们提供了Octotree这样的辅助阅读插件,直接在chrome扩展程序里搜索安装即可。

安装后我们就可以直接在web端就有IDLE读代码的体验:

可以看到在页面左侧有一个类似IDLE的目录栏,大大方便了我们查看和阅读项目代码。这是通用方法中的工具层面,我们再来看一些基本的阅读规矩。有了IDLE和Octotree工具,我们第一点一定是仔细看代码目录,对整个项目代码结构和分布有一个整体的认识,对于深度学习而言通常目录中各个模块相对比较固定,比如是models目录下放着模型搭建和训练的代码,conifg目录下放着模型的一些配置文件,data目录下放着项目所使用的数据信息等等。如下面语义分割项目的目录结构:

对深度学习项目代码的结构熟络之后,读的多了自然就会轻车熟路起来,后面阅读效率也就提高了。

通用方法的第二个是快速找到readme文档。通常来说,根目录下的readme文档包含了这份代码的使用方法,里面有可以让你快速了解这个项目的关键信息。一般来说,开源项目的readme里作者都会写明如何使用代码和进行部署。下图是DenseNet的readme文档:

对于大型项目,可能每一个子目录下都有readme文档,这都是我们需要仔细阅读的部分,作者把关键信息都放里面了。所以不管这样,第一时间读找到readme进行阅读是你了解该项目的必备步骤和通用方法。

第三个通用方法就是具体如何读的问题。就是我们得确定一个阅读主线。这一点是针对于深度学习项目代码的通用方法,对于一个深度学习项目,我们一般想要了解的最关键点无非就是数据、模型和如何训练等几个方面。如果你想快速看看这个开源项目的测试效果,直接读readme看使用方法即可。如果这个项目作者提出了一个新的模型框架,比如说bert,你想了解它的模型框架细节,直接定位到models目录下的带有model字眼的.py文件开始读。或者是你想看这个项目是如何训练的,都用了哪些训练的tricks,它的参数初始化是如何做的,batchsize用的多大,训练过程中学习率如何调整的等等,那么话不多说,直接定位到带train的.py文件即可。如下图faster-rcnn的3个训练文件。

根据目的不管是model还是train的主线,在阅读过程中一定会涉及到其他分支,比如说数据和配置等其他分支线。在主线阅读过程中不断完善对分支的理解,久而久之,一个完整的项目就会被你消化了。

以上说的是深度学习项目代码阅读的一些通用方法。下面再具体讲两个场景的代码阅读。毕竟大家做事讲究目的性,往往带有较强的目的性去做某事效率一般会特别高。

第一个场景是在大家做研究做项目时遇到问题时。不知道这个问题如何解决,直接谷歌又找不到好合适的方法的时候。这时候我们可能会寄希望于在GitHub上搜罗一番。比如说我们想要知道对于极度数据不平衡时如何给损失函数加权重的方法,再比如对于多标签问题进行模型预测时如何找到最佳分类阈值等等。这些问题都是我们在做实际项目时都可能会碰上的,在这种情况下若是能在GitHub上找到类似场景的处理方法,相信你会瞬间来了精神。

下述基于keras的CNN多标签分类项目对于多标签分类阈值寻优使用了matthews_corrcoef来确定最佳分类预测阈值。至于什么是matthews_corrcoef,这些都是你在解决问题过程中需要学习和吸收的地方。总之,带有目的性的读某个项目的代码往往是只读某个block甚至是某几个关键行,数量不在多,在于能够解决你的问题。

第二个场景就是为了自我个人精进的读代码。所谓个人精进,就是有大量可支配的个人学习和研究时间,高度的自律性和超强的学习力的人进行能力跃迁的关键所在。**笔者虽然平时偶尔会有去GitHub读一些代码,但说要达到个人精进的level,还远远不够。比如说前面的PyTorch 750k的源码,这么大的代码量,阅读策略一定是分治思想,分散包围和各个击破。把项目进行分解,设定阅读计划和目标,在超强的执行力下还是有可能完成的。这不是普通人干的事,但我相信能在深度学习领域精进的人都不会是普通人。

诚然,无论是读教材、读论文还是本篇所说的读代码,这些本身都是一个个人学习能力提升和知识汲取的过程。对于从事深度学习工作的我们而言,arxiv上的论文和GitHub上的代码都无穷尽,关键在于保持学习的劲头,做一名终身学习者

本文原创首发于公众号【机器学习实验室】,开创了【深度学习60讲】、【机器学习算法手推30讲】和【深度学习100问】三大系列文章。

一个算法工程师的成长之路

长按二维码关注机器学习实验室

机器学习实验室的近期文章:

  • 如何阅读一份深度学习项目代码?

  • 如何部署一个轻量级深度学习项目?

  • 基于C++的PyTorch模型部署

  • 用Keras写出像PyTorch一样的DataLoader方法

  • PyTorch数据Pipeline标准化代码模板

  • 算法工程师的一天

夕小瑶的卖萌屋

_

关注&星标小夕,带你解锁AI秘籍

订阅号主页下方「撩一下」有惊喜哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

令人拍案叫绝的Wasserstein GAN

本文后续:Wasserstein GAN最新进展:从weight clipping到gradient penalty,更加先进的Lipschitz限制手法 在GAN的相关研究如火如荼甚至可以说是泛滥的今天,一篇新鲜出炉的arXiv论文《Wasserstein GAN》却在Reddit的Machine Learnin…

java架构师进阶之独孤九剑:数据结构以及书籍推荐

这是整个java架构师连载系列,分为9大步骤,我们现在还在第一个步骤:程序设计和开发->数据结构与算法。 “ 如果说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作原理, 你完全可以不…

中文文本蕴含计算项目(88万中文文本蕴含数据集+中文文本蕴含模型)

ChineseTextualInference ChineseTextualInference project including chinese corpus build and inferecence model, 中文文本推断项目,包括88万文本蕴含中文文本蕴含数据集的翻译与构建,基于深度学习的文本蕴含判定模型构建. 项目地址:https://github.com/liuhuanyong/Chine…

论文浅尝 | 打通推荐系统与知识图谱: 第一个公开的大规模链接数据集合

本文转载自:RUC智能情报站,知乎专栏链接:https://zhuanlan.zhihu.com/RucAIBox前言:近年来,知识图谱(KB)被广泛应用于推荐系统(RS),但尚未有公开将推荐系统物…

数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

回文串为首尾对称的字符串: 如a,aba,abba等 单链表思路 1.将字符读入链表 2.找到链表中点 3.将链表从中点断开成2条,将后半条反转 4.比较两条链表是否相等(比较次数以少的为准(长度为奇数时&#xff…

丁香园在语义匹配任务上的探索与实践

前言语义匹配是NLP领域的基础任务之一,直接目标就是判断两句话是否表达了相同或相似意思。其模型框架十分简洁,通常包含文本表示和匹配策略两个模块,因而很容易扩展到相关应用场景,如搜索、推荐、QA系统等。此类模型通常依赖数据驱…

19本高并发编程书籍推荐

Java并发编程实战 (java并发的圣经) 多处理器编程的艺术 (并发编程的各种算法,java实现,有点难度) 并发的艺术 (多核处理器的共享内存模型中的各种算法) Java虚拟机并发编程 &#x…

Wasserstein metric的通俗解释

Wasserstein metric的通俗解释​关注他166 人赞同了该文章本文收录在无痛的机器学习第二季目录。Wasserstein GAN可以算是GAN界的一大突破了,有关它的介绍和使用心得的文章也已经满天飞了,感兴趣的童鞋随便一搜就能好多,今天就不说太多大家说…

肖仰华 | 领域知识图谱落地实践中的问题与对策

本文转载自公众号:知识工场。肖仰华教授2万字长文为您深度剖析领域知识图谱,对领域知识图谱技术与落地应用中的一系列关键问题做了系统的梳理与解答。肖仰华博士,复旦大学计算机科学与技术学院教授,博士生导师,知识工场…

数据结构--链表--约瑟夫环问题(单向循环链表)

问题:一群人站成一个圆圈,从一个人开始报数,1, 2 ,。。。m,报到m的拉出去砍了,求被砍的顺序和最后一个活下来的。 利用单向循环链表实现 C代码如下:(参考书籍&#xff…

献给新一代人工智能后浪——《后丹》

一只小狐狸带你解锁炼丹术&NLP秘籍视频来源:AIZOO《后丹》那些口口声声,掉包调参侠的人,应该看着你们像我一样,我看着你们,满怀羡慕。人类积攒了几十年的科技,所有的模型、数据、框架和显卡&#xff0c…

神经网络算法学习---mini-batch++++mini-batch和batch的区别

Batch_Size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开。 首先,为什么需要有 Batch_Size 这个参数? Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全…

进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!

阿里架构师必读书单 数据结构与算法:算法、算法导论等。 编程语言:java编程思想、java核心技术等 模式与设计:设计模式、代码重构、深入理解java虚拟机 数据库:mysql优化、oracle、redis实战、mongodb权威指南等。 架构设计&a…

刘知远 | 语义表示学习

本文转载自公众号:人工智能图灵。刘知远,清华大学计算机系副教授、博士生导师。主要研究方向为表示学习、知识图谱和社会计算。2011年获得清华大学博士学位,已在ACL、IJCAI、AAAI等人工智能领域的著名国际期刊和会议发表相关论文60余篇&#…

数据结构--链表--LRU缓存

LRU&#xff08;Least Recently Used&#xff09;缓存策略&#xff1a; 通俗的讲就是&#xff0c;最近使用的放在最前面&#xff0c;不经常使用的放后面&#xff0c;满了就删除 C代码实现 //用单链表实现LRU策略 2019.3.17 #include <iostream> #include <string…

透过现象看机器学习:奥卡姆剃刀,没有免费的午餐,丑小鸭定理等

一只小狐狸带你解锁炼丹术&NLP 秘籍本文对PAC学习理论、没有免费的午餐定理、丑小鸭定理、奥卡姆剃刀原理等机器学习中有名的理论或定理进行了详细的梳理。在机器学习中&#xff0c;有一些非常有名的理论或定理&#xff0c;这些理论不仅有助于我们从本质理解机器学习特性&a…

NAACL 2019最佳论文:量子概率驱动的神经网络

今天要介绍的文章与当前大火的 BERT 同获最佳论文&#xff0c;摘得 NAACL 2019 最佳可解释NLP论文&#xff08;Best Explainable NLP Paper&#xff09;。NAACL 与 ACL 和 EMNLP 并称之为 NLP 三大顶会&#xff0c;去年 ELMO 获得 outstanding paper&#xff0c;今年一共有五篇…

互联网优秀架构师必读书单V2.0

一篇文章搞懂高级程序员、架构师、技术经理、技术总监、CTO&#xff0c;从薪资到技能要领的区别&#xff0c;我提到了架构师的准确定义和所需工作年限&#xff0c;以及最重要的架构师的职责等。 从程序员进阶到架构师&#xff0c;6大核心技能详解&#xff0c;提到了从程序员进…

领域应用 | NLP 和知识图谱:金融科技领域的“双子星”

本文转载自公众号&#xff1a;恒生技术之眼。自然语言处理&#xff08;Natural Language Processing, NLP&#xff0c;语义计算&#xff09;和知识图谱&#xff08;Knowledge Graph, KG&#xff0c;知识计算&#xff09;作为认知智能的关键技术&#xff0c;正成为智能金融浪潮中…

数据结构--单链表single linked list(无表头哨兵)重写

针对上次写的单链表中不足的地方进行修改&#xff1a; 1.构造函数需要让用户输入&#xff08;bad&#xff09; 2.函数功能不单一&#xff0c;既操作链表&#xff0c;还打印输出&#xff08;bad&#xff09; 代码链接&#xff08;包含无头\有头单链表、循环单链表、双链表、循…