zoukankan      html  css  js  c++  java
  • 如何阅读和学习深度学习项目代码

    【前言】现在深度学习项目代码量越来越大,并且单个文件的量也非常的大。笔者总结了一些专家的经验并结合自己看的一些项目,打算总结一下如何探索和深入一个深度学习项目库。笔者pprp,未经允许不得擅自转发。

    1. 基础知识

    首先,需要保证有一定的深度学习基础知识,吴恩达的深度学习课还有斯坦福大学的CS231n都是不错的入门教程,只需要有大学数学的基础就可以看懂。

    然后,需要对Linux系统使用有一定的了解,一般选择Ubuntu系统作为主力系统,了解一下基础的系统命令就可以了,比如rm,ls,cd,cat,vim,sudo,find,df,top等,在B站上搜索一下Linux的视频,很快就可以入门。之后遇到新的命令只需要查询API即可。

    其次,还需要保证对python语言和深度学习框架的了解,python上手是很快的,可以看一下菜鸟教程或者莫烦python教程,上首页很快。深度学习框架方面可以买一些书籍,边看边敲,找一个小项目敲一敲,了解一下大部分API就已经达到上手水平了。深度学习框架一般选tensorflow、pytorch,因为大部分项目大多是基于这两个框架的。他们官方网站的教程也是非常不错的参考,可以看看官方提供的教程,跑一下github上提供的demo。

    最后,营造科研的环境,可以关注一些领域相关的大牛、公众号,也可以加入一些交流群,多和群友交流,尽可能提升领域的常识。不要乱问问题,一定要有自己的思考和想法,然后再到群里问问题和交流。

    2. 项目分析阅读

    从Github上拿到一个项目,可以按照以下的步骤进行分析和阅读。

    • 项目背景调研:

      • 项目是否是对应一篇论文?如果对应论文,可以先阅读一下Paper,对背景和项目的细节有一个大概的了解。
      • 项目是否有说明文档?一般比较大型的项目,比如pytorch,nni,mmdetection等较多人维护的项目是会在readthedoc上提供说明书,建议优先阅读说明。
      • 项目是否有README?README文件通常包含了项目创建者想要告诉你的信息,对于一些专业的项目库而言,阅读README文件绝对对你理解整个项目代码有帮助。
      • 什么都没有??极少数会遇到这种情况,但如果遇到的话,就进行下一个阶段吧。
    • 通过文件命名分析:

      • 根据文件夹、文件的命名,判断其可能的功能。一般在深度学习项目中,通常有几部分组成:
        • 数据处理、数据加载部分,通常命名可能有xxx_dataloader.py等
        • 网络模型构建部分,通常命名可能为 resnet20.py model.py等
        • 训练部分脚本,通常命名可能为train.py等
        • 测试部分脚本,通常命名可能为test.py eval.py 等
        • 工具库,通常命名为utils文件夹。
      • 举个例子,以once for all项目为例:
    .
    ├── build.sh # 环境构建
    ├── eval_ofa_net.py
    ├── eval_specialized_net.py # 验证专用网络
    ├── figures
    │   ├── cnn_imagenet_new.png
    │   ├── diverse_hardware.png
    │   ├── imagenet_80_acc.png
    │   ├── ofa-tutorial.jpg
    │   ├── overview.png
    │   └── video_figure.png
    ├── LICENSE
    ├── ofa 
    │   ├── imagenet_classification 
    │   │   ├── data_providers # 数据加载
    │   │   ├── elastic_nn # 算法核心模块
    │   │   ├── __init__.py
    │   │   ├── networks # 网络构建
    │   │   └── run_manager # 训练代码核心逻辑
    │   ├── __init__.py
    │   ├── model_zoo.py # 模型库
    │   ├── nas # nas相关工具
    │   │   ├── accuracy_predictor
    │   │   ├── efficiency_predictor
    │   │   ├── __init__.py
    │   │   └── search_algorithm
    │   ├── tutorial # 教程
    │   │   ├── accuracy_predictor.py
    │   │   ├── evolution_finder.py
    │   │   ├── flops_table.py
    │   │   ├── imagenet_eval_helper.py
    │   │   ├── __init__.py
    │   │   └── latency_table.py
    │   └── utils # 工具库
    │       ├── common_tools.py
    │       ├── flops_counter.py
    │       ├── __init__.py
    │       ├── layers.py
    │       ├── my_dataloader
    │       ├── my_modules.py
    │       ├── pytorch_modules.py
    │       └── pytorch_utils.py
    ├── README.md # 项目介绍,初次接触需要阅读
    ├── requirements.txt # 环境文件
    ├── setup.py # pip构建环境所需文件
    ├── train_ofa_net.py # 训练脚本
    └── tutorial # 教程
        ├── local_lut.npy
        ├── ofa.ipynb
        ├── ofa_resnet50_example.ipynb
        └── README.md
    
    
    • 找到程序运行入口:
      • 通过上一步的分析,找到了项目的介绍的话,在自己机器上完成环境配置。
      • 一般可以找到项目运行的主入口,比如train.py,试着运行项目。
      • 遇见bug怎么办?
        • 第一类bug,环境不兼容导致的bug,严格按照作者提供的运行环境,并对照环境的版本信息,对齐本地环境和作者要求的环境。
        • 第二类bug,深度学习框架带来的bug,这部分bug可以在bing上进行搜索,查看解决方案。
        • 第三类bug,项目本身相关的bug,这类bug最好是在github的issue区域进行查找,如果无法解决可以在issue部分详细描述自己的问题,等待项目库作者的解答。
      • 运行顺利的话,代表可以进行debug操作,对文件某些细节不确定的话,可以通过debug的方式查看变量详细内容。
    • 用IDE打开项目:
      • 笔者是vscode党,推荐使用vscode+scp+mobaxterm+远程服务器的方式进行运行。
      • 打开项目以后,从运行入口(通常是train.py)开始阅读:
        • 阅读入口文件的逻辑,查看调用到了哪些包。
        • 通过IDE的功能跳转到对应类或者函数进行继续阅读,配合代码注释进行分析。
        • 分析过程可能会需要软件工程的知识,比如画一个类图来表述项目的关系。
        • 一开始可以泛读,大概了解整体流程,做一些代码注释。而后可以精读,找到文章的核心,反复理解核心实现,抽丝剥茧,一定可以对这个项目有进一步的理解。
    • 实在读不懂怎么办?
      • 在Github的issue上进行提问。
      • 如果有项目作者的联系方式,可以联系作者,发邮件提问。
      • 看看有没有其他人写过相关的博客。

    参考

    https://www.zhihu.com/question/26480537

    https://www.zhihu.com/question/29416073/answer/44301979

    https://github.com/phodal/articles/issues/14

    代码改变世界
  • 相关阅读:
    Hihocoder 1275 扫地机器人 计算几何
    CodeForces 771C Bear and Tree Jumps 树形DP
    CodeForces 778D Parquet Re-laying 构造
    CodeForces 785E Anton and Permutation 分块
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale 二分
    Hexo Next 接入 google AdSense 广告
    如何统计 Hexo 网站的访问地区和IP
    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
    通过ODBC接口访问人大金仓数据库
  • 原文地址:https://www.cnblogs.com/pprp/p/14819944.html
Copyright © 2011-2022 走看看