前言 训练过程主要是指编写train.py文件,其中包括参数的解析、训练日志的配置、设置随机数种子、classdataset的初始化、网络的初始化、学习率的设置、损失函数的设置、优化方式的设置、tensorboard的配置、训练过程的搭建等。

由于篇幅问题,这些内容将分成多篇文章来写。本文介绍参数解析的两种方式。

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

一个模型中包含众多的训练参数,如文件保存目录、数据集目录、学习率、epoch数量、模块中的参数等。

参数解析常用的有两种方式。

一种是将所有参数都放在yaml文件中,通过读取yaml文件来配置参数。这种一般用于比较复杂的项目,例如有多个模型,对应多组参数。这样就可以每个模型配置一个yaml文件,里面对应的是每个模型的对应的参数。

另一种是直接在train.py文件中通过argparser解析器来配置。这种一般用于仅一个模型或比较简单的项目中。每次只需要改一两个参数的。

yaml文件解析

yaml语法规则

大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。(可以将你的ide的tab按键输出替换成4个空格)
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#表示注释

yaml文件示例

TRAIN:
RESUME_PATH: "/path/to/your/net.pth"
DATASET: ucf24 # `ava`, `ucf24` or `jhmdb21`
BATCH_SIZE: 10
TOTAL_BATCH_SIZE: 128
SOLVER:
MOMENTUM: 0.9
WEIGHT_DECAY: 5e-4
LR_DECAY_RATE: 0.5
NOOBJECT_SCALE: 1
DATA:
TRAIN_JITTER_SCALES: [256, 320]
TRAIN_CROP_SIZE: 224
TEST_CROP_SIZE: 224
MEAN: [0.4345, 0.4051, 0.3775]
STD: [0.2768, 0.2713, 0.2737]
MODEL:
NUM_CLASSES: 24
BACKBONE: darknet
WEIGHTS:
BACKBONE: "weights/yolo.weights"
FREEZE_BACKBONE_2D: False
LISTDATA:
BASE_PTH: "datasets/ucf24"
TRAIN_FILE: "path/to/your/classdataset/trainlist.txt"
TEST_FILE: "path/to/your/classdataset/testlist.txt"

yaml的解析

这里介绍两种方法,一种比较复杂的,像上面这个有两级。解析比较麻烦,代码如下:

import yaml
import argparser
from fvcore.common.config import CfgNode
cfg = CfgNode()
cfg.TRAIN= CfgNode() #每一级都要这样新建一个节点
cfg.TRAIN.RESUME_PATH = "Train"
cfg.TRAIN.DATASET = "ucf24" # `ava`, `ucf24` or `jhmdb21`
cfg.TRAIN.BATCH_SIZE=10
cfg.TRAIN.TOTAL_BATCH_SIZE=128
...
cfg.SOLVER= CfgNode() #每一级都要这样新建一个节点
cfg.SOLVER.MOMENTUM=0.9
cfg.SOLVER.WEIGHT_DECAY=5e-4
... yaml_path = "yaml_test.yaml"
cfg.merge_from_file(yaml_path) #访问方法
print(cfg.TRAIN.RESUME_PATH)

它的麻烦在于需要将所有的元素都初始化一遍,然后通过cfg.merge_from_file(yaml_path)来根据yaml文件更新这些元素。

另一种是比较简单的解析二级的方法。

import yaml
import argparser
with open(yaml_path,'r') as file:
opt = argparse.Namespace(**yaml.load(file.read(),Loader=yaml.FullLoader))
#访问方法
print(opt.TRAIN["RESUME_PATH"])

即第一级是在argparse的Namespace中,可通过点号来访问,第二级仍然是字典的形式。但它简单太多了。如果只有一级的话,直接通过点号就可以了。如果不使用argparse.Namespace,则两级都是字典,直接通过访问字典的形式也可以。

argparser解析

argparser解析的形式一般放在train.py文件的最前面,适用于参数相对比较少,每次只需要改一两个参数的情况。(我本人习惯将它放在其它文件中,例如单独搞一个parser.py或直接放在util.py中,只因为如果放在train前每次都要滑动很长才能到train的部分,相当麻烦)

先来个标准示例

import argparser
def get_args():
parser = argparse.ArgumentParser(description='Training')
parser.add_argument('--color_jitter', action='store_true', help='use color jitter in training')
parser.add_argument('--batchsize', default=8, type=int, help='batchsize')
parser.add_argument('--gpu_ids', default='0', type=str, help='gpu_ids: e.g. 0 0,1,2 0,2')
return parser.parse_args() #使用方法
python train.py
--color_jitter \
--batchsize=16 \
--gpu_ids='0' #访问元素
opt = get_args()
print(opt.batchsize)

这里列举了三种形式,一种是action的,当action='store_true'时,默认是false,在设置参数时直接--color_jitter即可变成True,另外两种如上所示。

下一篇将介绍编写训练过程的训练日志的配置、设置随机数种子、classdataset的初始化、网络的初始化、学习率的设置、损失函数的设置、优化方式的设置等内容。

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

CV技术指南创建了一个免费的知识星球。关注公众号添加编辑的微信号可邀请加入。

征稿通知:欢迎可以写以下内容的朋友联系我(微信号:“FewDesire”)。

  1. TVM入门到实践的教程
  2. TensorRT入门到实践的教程
  3. MNN入门到实践的教程
  4. 数字图像处理与Opencv入门到实践的教程
  5. OpenVINO入门到实践的教程
  6. libtorch入门到实践的教程
  7. Oneflow入门到实践的教程
  8. Detectron入门到实践的教程
  9. CUDA入门到实践的教程
  10. caffe源码阅读
  11. pytorch源码阅读
  12. 深度学习从入门到精通(从卷积神经网络开始讲起)
  13. 最新顶会的解读。例如最近的CVPR2022论文。
  14. 各个方向的系统性综述、主要模型发展演变、各个模型的创新思路和优缺点、代码解析等。
  15. 若自己有想写的且这上面没提到的,可以跟我联系。

声明:有一定报酬,具体请联系详谈。若有想法写但觉得自己能力不够,也可以先联系本人(微信号:FewDesire)了解。添加前请先备注“投稿”。

其它文章

招聘 | ​迁移科技招聘深度学习、视觉、3D视觉、机器人算法工程师等多个职位

计算机视觉入门路线

YOLO系列梳理(一)YOLOv1-YOLOv3

YOLO系列梳理(二)YOLOv4

YOLO系列梳理(三)YOLOv5

Attention Mechanism in Computer Vision

从零搭建Pytorch模型教程(三)搭建Transformer网络

从零搭建Pytorch模型教程(二)搭建网络

从零搭建Pytorch模型教程(一)数据读取

StyleGAN大汇总 | 全面了解SOTA方法、架构新进展

一份热力图可视化代码使用教程

一份可视化特征图的代码

工业图像异常检测研究总结(2019-2020)

关于快速学习一项新技术或新领域的一些个人思维习惯与思想总结

从零搭建Pytorch模型教程(四)编写训练过程--参数解析的更多相关文章

  1. 从零搭建Pytorch模型教程(三)搭建Transformer网络

    ​ 前言 本文介绍了Transformer的基本流程,分块的两种实现方式,Position Emebdding的几种实现方式,Encoder的实现方式,最后分类的两种方式,以及最重要的数据格式的介绍. ...

  2. 从零搭建Pytorch模型教程(一)数据读取

    ​  前言  本文介绍了classdataset的几个要点,由哪些部分组成,每个部分需要完成哪些事情,如何进行数据增强,如何实现自己设计的数据增强.然后,介绍了分布式训练的数据加载方式,数据读取的整个 ...

  3. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)

    前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...

  4. tensorflow笔记:模型的保存与训练过程可视化

    tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...

  5. tensorflow:模型的保存和训练过程可视化

    在使用tf来训练模型的时候,难免会出现中断的情况.这时候自然就希望能够将辛辛苦苦得到的中间参数保留下来,不然下次又要重新开始. 保存模型的方法: #之前是各种构建模型graph的操作(矩阵相乘,sig ...

  6. [译]Godot系列教程四 - 编写脚本

    编写脚本(Scripting) 简介 关于无需编程即可创建视频游戏的那些工具的谈论有很多.不用学习编程知识对很多独立开发者来说就是一个梦想.这种需求 - 游戏开发者.甚至在很多公司内部,希望对游戏流程 ...

  7. 从零搭建SSM框架(四)手动实现Tomcat部署

    发布War包 Windows环境部署 增加如下配置 <Context path="/" docBase="cnki" debug="0" ...

  8. 利用Tensorboard可视化模型、数据和训练过程

    在60分钟闪电战中,我们像你展示了如何加载数据,通过为我们定义的nn.Module的子类的model提供数据,在训练集上训练模型,在测试集上测试模型.为了了解发生了什么,我们在模型训练时打印了一些统计 ...

  9. Qt零基础教程(四) QWidget详解篇

    在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...

随机推荐

  1. css 迷惑的position

    迷惑的position 小加发现实际开发中position使用频率很高,但很多人却对position不是很了解,导致开发中出现各种问题,现在让我门一起来看看这个迷惑的position吧~ static ...

  2. 重磅:前端 MVVM 与 FRP 的升阶实践 —— ReRest 可视化编程

    ReRest (Reactive Resource State Transfer) 是前端开发领域新兴的方法论体系,它继承了 MVVM 与 FRP 编程理念,在技术上有不少创新.本文从专利稿修改而来, ...

  3. Graphics 与 DisplayObject 的关系

    在原生 Canvas 中,其实并没有 DisplayObject 的概念,它只有绘制图像的概念. 大部分的原生绘制图形或图像的 API 一般是这样的: api(x, y, ...) 例如 rect 就 ...

  4. Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件

    1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...

  5. python---二维数组的查找

    """ 在一个二维数组中(每个一维数组的长度相同), 每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. """ # ...

  6. win2008升级mysql5.7.20步骤总结

    环境: 系统:红帽5.5 旧版mysql:5.5 新版mysql:5.7.20 前期准备: 1.备份旧版mysql数据,不知道data目录在哪可以在my.ini配置文件里面查看datadir指定的目录 ...

  7. XStream使用记录

    XStream使用记录 官网 http://x-stream.github.io/index.html 下载地址 http://x-stream.github.io/download.html 参考资 ...

  8. jni有关知识点总结

    一.c/c++语言: 1.关于动态链接库的搜索问题: LIBRARY_PATH is used by gcc before compilation to search for directories ...

  9. [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错

    layout: post title: [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错 subtitle: 记一次debug经历 ...

  10. 记录Neo4j上写的简单cypher语法

    neo4j是一个高性能的图形数据库,既然是数据库,那么主要操作就是增.删.改.查.所以进入正题: 一.CREATE:创建 语法如下: 1.create(变量名:标签名) :建立一个标签为Animal的 ...