yacs、yaml进行实验参数配置详解

1 介绍

       很多模型需要设置超参数,当超参数过多时,不方便管理,于是出现了很多类似yaml,yacs的包。YACS是一个轻量级库,用于定义和管理系统配置,例如那些在为科学实验设计的软件中常见的配置。这些“配置”通常涵盖诸如用于训练机器学习模型的超参数或可配置模型超参数(如卷积神经网络的深度)之类的概念。由于您正在进行科学研究,因此重复性至关重要,因此您需要一种可靠的方法来序列化实验配置。YACS使用YAML作为简单的,人类可读的序列化格式。

范式是:

your code + a YACS config for experiment E(+ external dependencies + hardware + other nuisance terms...) = reproducible experiment E。

       虽然您可能无法控制所有内容,但至少可以控制代码和实验配置。

2 用法

       YACS可以以各种灵活的方式使用,主要的范例又两种:

配置为局部变量(local variable)

配置为全局变量(global singleton)

       可以根据需要选择使用哪一种模式,但推荐使用local variable模式

       要在项目中使用YACS,首先要创建一个项目配置文件,通常称为config.py或defaults.py。此文件是所有可配置选项的一站式参考点。它应该有很好的文档记录,并为所有选项提供合理的默认值

#my_project/config.py
from yacs.config import CfgNode as CN

#创建一个配置节点 _C
_C = CN()

#在_C下创建新的配置节点_C.SYSTEM
#给_C.SYSTEM的属性配置默认值
_C.SYSTEM = CN()
#Number of GPUS to use in the experiment
_C.SYSTEM.NUM_GPUS = 8
#Number of workers for doing things
_C.SYSTEM.NUM_WORKERS = 4

_C.TRAIN = CN()
#A very important hyperparameter
_C.TRAIN.HYPERPARAMETER_1 = 0.1
#The all important scales for the stuff
_C.TRAIN.SCALES = (2,4,8,16)

def get_cfg_defaults():
    """Get a yacs CfgNode object with default values for my_project."""
    #克隆一份配置节点_C的信息返回,_C的信息不会改变
    #This is for the "local variable" use pattern
    
    return _C.clone


# Alternatively, provide a way to import the defaults as
# a global singleton:
# cfg = _C  # users can `from config import cfg`

       接下来,需要创建YAML配置文件,通常你会为每个实验创建一个。每个配置文件仅重写该实验中需要更改的配置选项。

#my_project/experiment.yaml
SYSTEM:
    NUM_GPUS:2
TRAIN:
    SCALES:(1,2)

       最后,您可以在你的实际项目代码使用配置。在初始设置之后,最好通过调用freeze()方法将配置冻结以防止进一步修改。如下图所示,配置选项可以通过导入cfg并直接访问它来使用全局选项集(globle singleton模式),或者可以复制cfg并将其作为参数传递(local variable模式)。

# my_project/main.py
 
import my_project
from config import get_cfg  # local variable usage pattern, or:
# from config import cfg  # global singleton usage pattern

if __name__ == "__main__":
    cfg = get_cfg_defaults()
    cfg.merge_from_file("experiment.yaml")
    cfg.freeze()
    print(cfg)

    #Example of using the cfg as global access to options
    if cfg.SYSTEM.NUM_GPUS > 0:
        my_project.setup_multi_gpu_support()

    model = my_project.create_model(cfg)

命令行重写

       也可以使用完全限定的键值对列表更新CfgNode。这样可以轻松地从命令行使用覆盖选项。例如:

cfg.merge_from_file("experiment.yaml")
#Now override from a list (opts could come from the command line)
opts = ["SYSTEM.NUM_GPUS",8,"TRAIN.SCALES","(1,2,3,4)"]
cfg.merge_from_list(opts)

       建议采用以下原则:“相同的配置选项只使用一种方法。”这个原则意味着如果在YACS配置对象中定义了一个选项,那么你的程序应该使用cfg.merge_from_list(opts)设置该配置选项,而不是通过定义--train-scales作为命令行参数来实现。然后用来设置cfg.TRAIN.SCALES。

:一般defaults.py为默认的所有超参数配置,而xxx.yaml文件为每种实验设置需要的不同的参数设置。

       以上来自github上的官方文档yacs的readme部分。

       直接加载.yaml文件,且引用配置文件里变量的方法不是字典方式,而是通过符号"."级联

from yacs.config import CfgNode as CN

yaml_name = 'my_project/experiment.yaml'
fcfg = open(yaml_name)
cfg = CN.load_cfg(fcfg)
cfg.freeze()
print(cfg.SYSTEM.NUM_GPUS) 

3 常用方法

参考yacs配置神经网络参数yacs的使用教程

merge_from_file()

       merge_from_file()是非常重要的一个函数,在一个任务中你可能需要尝试不同的参数进行实验,这就需要这个函数,首先创建 config.py 和 training.yaml 之后,比较两者之间的参数,然后在config.py对 _C 初始化之后执行此函数,就会修改我们的初始化参数了,也就是说 training.yaml 中的参数会覆盖原有的初始化的参数。

注意:training.yaml中不能包含config.py中没有的参数,不然会报错。反过来如果 config.py 中有的参数我们不需要更改,那么training.yaml可以不设置。在_C中申明过后的变量才能被赋值和修改,如果_C中没有某个变量,而yaml中有,那就会报错,因为该变量未能事先申明。

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L_bloomer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值