zoukankan      html  css  js  c++  java
  • 0801-深度学习程序架构设计

    0801-深度学习程序架构设计

    pytorch完整教程目录:https://www.cnblogs.com/nickchen121/p/14662511.html

    前几章已经把 pytorch 的大部分基础知识讲的很详细了,足够我们未来的使用,但是如果你想更加详细的了解 pytorch 的使用方法,推荐去阅读 pytorch 的官方文档, 而不是去看其他作者写的书籍或者博客,因为所有人的文章都不过是对官方文档做了自己的见解罢了。

    接下来我们将给大家讲解一个又一个项目实战,但是本章的重点还不是带你去使用 pytorch 的接口,去构建一个花里胡哨的项目,更多的是带你去了解一个程序的架构,也就是说这一章将会带领同学们去合理地设计程序的结构,让你们的程序更具可读性、更易用。

    一、程序架构设计

    学习某个深度学习框架时,掌握它的基本知识和接口虽然重要,但是如何合理地组织代码,让代码具有良好的可读性和扩展性也是很重要的。为此,本章更多的是讲解经验性的东西,又因为这些经验涉及的更多是个人喜好和代码风格,这种喜好每个人应该都是不一样的,为此在参考这些经验时可以把它当做是一种参考或提议。

    在做深度学习实验和项目时,为了得到最优的模型结果,中间往往需要很多次的尝试和修改。但是如果能够合理地组织文件结构,以及使用一些小技巧可以极大地提高代码的易读易用性。根据作者的经验,在大多数深度学习的项目研究时,程序都需要实现以下几个功能:

    • 模型定义
    • 数据处理和加载
    • 训练模型(Train & Validate)
    • 训练过程可视化
    • 测试(Test/Inference)

    除了上述所说的,程序应该还要满足以下几个要求:

    • 模型需要具有高度可配置型,方便修改参数、修改模型和反复实验
    • 代码需要具有良好的组织结构,让人一目了然
    • 代码应该要有良好的说明,让他人能够了解

    二、文件组织结构

    前面提到过程序的主要功能,其中最重要的三个功能如下:

    • 模型定义
    • 数据加载
    • 训练和测试

    首先来看程序文件的组织结构:

    checkpoints/
    data/
        __init__.py
        dataset.py
        get_data.sh
    
    models/
        __init__.py
        AlexNet.py
        BasicModule.py
        ResNet34.py
        
    utils/
        __init__.py
        visualize.py
        
    config.py
    main.py
    requirement.txt
    README.md
    

    上式各个文件的主要内容和作用如下:

    • checkpoints/:用于保存训练好的模型,可让程序在异常退出后仍然能够重新载入模型,恢复训练
    • data/:数据相关操作,包括数据预处理、dataset 实现等
    • models/:模型定义,可以有多个模型,例如上面的 AlexNet 和 ResNet34,一个模型对应一个文件
    • utils/:可能用到的工具函数,本次实验中主要封装了可视化工具
    • config.py:配置文件,所有可配置的变量都集中在此,并提供默认值
    • main.py:主文件,训练和测试程序的入口,可通过不同的命令来指定不同的操作和参数
    • requirements.txt:程序依赖的第三方库
    • README.md:提供程序的必要说明

    三、关于 __init__.py

    想详细了解 __init__.py 的同学们可以参考这篇博客:https://www.cnblogs.com/nickchen121/p/10804427.html

    可以看到几乎每个文件夹下都有 init 这个文件,一个目录中如果包含了 init 文件,那么它就变成了一个包。init 可以为包,也可以定义包的属性和方法,但是它必须存在,因为其他程序才能从这个目录中导入相应的模块或函数。

    例如在 data 文件夹下有 init 文件,在 main 中就可以 from data.dataset import DogCat。如果在 data 中的 init 中写入 from .dataset import DogCat,则可以在 main 中就可以直接写成 from data import DogCat,或者 import data; dataset = data.DogCat,比写为 from data.dataset import DogCat 更便捷。

  • 相关阅读:
    082、Java数组之数组传递之简化理解
    081、Java数组之数组传递
    080、Java数组之二维数组的定义及使用
    079、Java数组之数组的静态初始化
    078、Java数组之数组的引用传递
    077、Java数组之分步实现数组操作
    076、Java数组之定义数组
    075、Java面向对象之定义匿名对象
    074、Java面向对象之构造方法重载
    073、Java面向对象之利用构造方法为属性赋值
  • 原文地址:https://www.cnblogs.com/nickchen121/p/14726984.html
Copyright © 2011-2022 走看看