@TOC
官方库地址:GitHub
安装:pip install yacs
这个方法比argparse库
好用的地方在于你可以建很多个yaml文件,文件里用不同的参数,当一个实验做完继续做下一个实验时重新建立一个文件即可,而不需要更改argparse的参数或者在命令行修改了,附上我写的argparse的链接
yacs
的使用比较简单,这里我们先看一个实例,然后在介绍一些yacs库
的方法
一、实例
新建两个文件config.py
和training.yaml
config.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 from typing import Any , List from yacs.config import CfgNode as CNclass Config (object ): def __init__ (self, config_yaml: str , config_override: List [Any ] = [] ): self._C = CN() self._C.GPU = [0 ] self._C.MODEL = CN() self._C.MODEL.MODE = 'global' self._C.OPTIM = CN() self._C.OPTIM.BATCH_SIZE = 1 self._C.OPTIM.NUM_EPOCHS = 100 self._C.TRAINING = CN() self._C.TRAINING.TRAIN_DIR = 'images_dir/train' self._C.TRAINING.VAL_DIR = 'images_dir/val' self._C.TRAINING.SAVE_DIR = 'checkpoints' self._C.merge_from_file(config_yaml) self._C.merge_from_list(config_override) self._C.freeze() def dump (self, file_path: str ): r"""Save config at the specified file path. Parameters ---------- file_path: str (YAML) path to save config at. """ self._C.dump(stream=open (file_path, "w" )) def __getattr__ (self, attr: str ): return self._C.__getattr__(attr) def __repr__ (self ): return self._C.__repr__()
training.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 GPU: [0 ,1 ,2 ,3 ,4 ,5 ]MODEL: MODE: 'Deraining' OPTIM: BATCH_SIZE: 2 NUM_EPOCHS: 250 TRAINING: TRAIN_DIR: './Datasets/train' VAL_DIR: './Datasets/test/Rain100L' SAVE_DIR: './checkpoints'
使用:将这两个文件放在同一个文件夹下,然后再main.py
中调用即可
main.py
1 2 3 4 5 6 7 8 9 10 from config import Configconf = Config("training.yaml" ) print (conf)''' CfgNode({'GPU': [0, 1, 2, 3, 4, 5], 'MODEL': CfgNode({'MODE': 'Deraining'}), 'OPTIM': CfgNode({'BATCH_SIZE': 2, 'NUM_EPOCHS': 250}), 'TRAINING': CfgNode({'TRAIN_DIR': './Datasets/train', 'VAL_DIR': './Datasets/test/Rain100L', 'SAVE_DIR': './checkpoints'})}) '''
索引时也比较简单,比如想要知道MODEL
的MODE
模式,只需要使用confi.MODEL.MODE
即可
二、方法
在上面我们展示了yacs
的基本使用,这里我们介绍yacs
库的一些方法
1. config node节点
我们先来看上面的输出
1 2 3 4 5 6 7 ''' CfgNode({'GPU': [0, 1, 2, 3, 4, 5], 'MODEL': CfgNode({'MODE': 'Deraining'}), 'OPTIM': CfgNode({'BATCH_SIZE': 2, 'NUM_EPOCHS': 250}), 'TRAINING': CfgNode({'TRAIN_DIR': './Datasets/train', 'VAL_DIR': './Datasets/test/Rain100L', 'SAVE_DIR': './checkpoints'})}) '''
在每个参数前都有CfgNode
,他是由CN
来创建的,也就是最初import的from yacs.config import CfgNode as CN
,并且这个节点可以嵌套使用
看下面代码,我们创建了一个_C=CN()
之后,又用_C.MODEL=CN()
,这就实现了嵌套使用,帮助我们理解MODE
变量是归属于MODEL
下面的
1 2 3 4 5 _C = CN() _C.GPU = [0 ] _C.MODEL = CN() _C.MODEL.MODE = 'global'
2. freeze & defrost
freeze()
函数使用后,我们创建的变量就不可以进行修改了,再次使用defrost()
函数,变量可以再次修改,例如
1 2 3 4 5 6 7 8 9 10 11 _C = CN() _C.GPU = [0 ] _C.MODEL = CN() _C.MODEL.MODE = 'global' _C.freeze() _C.GPU = [0 , 1 ] _C.defrost() _C.GPU = [0 , 1 ]
3. merge_from_file
merge_from_file()
是非常重要的一个函数,在一个任务中你可能需要尝试不同的参数进行试验,这就需要这个函数,首先创建config.py
和training.yaml
之后,比较两者之间的参数,然后在config.py
对_C
初始化之后执行此函数(参考最初的例子),就会修改我们的初始化参数了,也就是说training.yaml
中的参数会覆盖原有的初始化的参数
注意:training.yaml中不能包含config.py中没有的参数,不然会报错。反过来如果config.py中有的参数我们不需要更改,那么training.yaml可以不设置
还是举个例子方便理解
假设我们config.py
中初始化的参数为
1 2 3 4 5 6 7 _C = CN() _C.GPU = [0 ] _C.batch = 64 _C.lr = 0.001 _C.MODEL = CN() _C.MODEL.MODE = 'global'
那么training.yaml
中的参数可以设置为
1 2 3 4 5 6 7 8 9 10 11 GPU: [0 ,1 ,2 ,3 ,4 ,5 ]GPU: [0 ,1 ,2 ,3 ,4 ,5 ]batch: 64 MODEL: MODE: 'Deraining' gpu: [0 ,1 ,2 ,3 ,4 ]