引 言yacs库作为一个管理系统配置的轻量级库,解析yaml配置文件使整个项目结构更清晰。yacs库与argparse库类似,argparse库需要在运行程序文件中定义配置参数,而yacs将配置参数可以放置在其他文件中。
文章目录
一、yacs库创建配置文件
1.1 创建配置文件
yacs库创建的配置文件名称为default.py
或者config.py
。在配置文件中需要使用核心类CfgNode
创建节点,在各节点中定义参数名称并分配默认值,各节点下的内容可以直接访问。
创建config/default.py
文件
from yacs.config import CfgNode as CN
config = CN() #主节点
config.OUTPUT_DIR = 'output_folder/'
config.LOG_DIR = 'output_folder/log_folder/'
# model parameters
config.MODEL = CN() #子节点
config.MODEL.NAME = 'Resnet'
config.MODEL.PRETRAINED = ''
# training parametes
config.TRAIN = CN()
config.TRAIN.IMAGE_SIZE = [224, 224]
config.TRAIN.EPOCH = 30
print(config) #打印配置信息
配置信息显示
LOG_DIR: output_folder/log_folder/
MODEL:
NAME: Resnet
PRETRAINED:
OUTPUT_DIR: output_folder/
TRAIN:
EPOCH: 30
IMAGE_SIZE: [224, 224]
1.2 配置参数查、增、改
可以在project\demo.py
文件中查询、增加、修改配置信息
from config.default import config
if __name__ == '__main__':
# 查询配置参数
print(config.OUTPUT_DIR) # output_folder/
print(config.MODEL.NAME) # Resnet
print('-'*50)
# 修改配置参数
config.TRAIN.EPOCH = 50
print(config.TRAIN.EPOCH) # epoch=50
print('-' * 50)
# TRAIN中增加新参数LR
config.TRAIN.LR = 0.01
print(config.TRAIN)
###屏幕显示结果###
output_folder/
Resnet
--------------------------------------------------
50
--------------------------------------------------
EPOCH: 50
IMAGE_SIZE: [224, 224]
LR: 0.01
1.3 配置信息备份
为避免实验修改部分参数导致实验出现bug,可以通过clone()
函数对原始配置文件的数据信息进行复制。
cfg_new = config.clone()
cfg_new.MODEL.NAME = 'lenet'
print(cfg_new.MODEL.NAME) #新配置文件的模型名称lenet
print(config.MODEL.NAME) #原始配置文件的模型名称Resnet
二、更新配置参数
在实际项目中,更新配置参数信息可以采用两种方式:
- 使用yaml文件更新
- 使用列表进行更新
更新参数时需先调用defrost()
函数解冻配置节点,参数更新完毕后调用freeze()
函数冻结配置节点,避免实验过程中更改参数,对实验配置信息起一定保护作用。
2.1 文件更新配置参数
文件更新配置节点需调用merge_from_file(cfg_filename)
函数,cfg_filename
为yaml
文件名。
示例:
project\test.yaml
文件中的配置信息
MODEL:
NAME: Lenet
OUTPUT_DIR: output_folder/
TRAIN:
EPOCH: 50
IMAGE_SIZE:
- 112
- 224
在project\demo.py
程序中,加载default.py
文件中的配置信息节点config
,调用merge_from_file()
函数更新配置信息。
from config.default import config
if __name__ == '__main__':
config.defrost() #解冻节点
config.merge_from_file('./test.yaml')
config.freeze() #冻结节点
print(config)
打印config配置结果
LOG_DIR: output_folder/log_folder/
MODEL:
NAME: Lenet
PRETRAINED:
OUTPUT_DIR: output_folder/
TRAIN:
EPOCH: 50
IMAGE_SIZE: [112, 224]
注:用文件更新配置参数时,系统自动比对yaml
文件和default.py
中的参数名是否相同并对更改参数值,文件中的参数数量可少于default.py文件中的参数量,yaml文件中没有的参数自动使用default.py
配置文件的默认值。但如果配置参数量多于default文件中的参数量,需在default.py
中针对添加额外配置信息的节点初始化时设置属性new_allowed=True。
例如:想对TRAIN节点增加学习率参数LR,在default.py
文件中创建TRAIN节点时设置new_allowed
config.TRAIN = CN(new_allowed=True)
from yacs.config import CfgNode as CN
config = CN() #主节点
config.OUTPUT_DIR = 'output_folder/'
config.LOG_DIR = 'output_folder/log_folder/'
# training parametes
config.TRAIN = CN(new_allowed=True) #可增加额外配置信息
config.TRAIN.IMAGE_SIZE = [224, 224]
2.2 列表更新配置参数
用列表更新配置参数时,无法新增default.py
文件中没有的参数名。
opts = ['TRAIN.EPOCH',20,'MODEL.NAME','alexnet']
config.merge_from_list(opts)
三、深度学习项目参数配置完整程序示例
project/config/default.py
from yacs.config import CfgNode as CN
config = CN() #主节点
config.OUTPUT_DIR = 'output_folder/'
config.LOG_DIR = 'output_folder/log_folder/'
# model parameters
config.MODEL = CN() #子节点
config.MODEL.NAME = 'Resnet'
config.MODEL.PRETRAINED = ''
config.MODEL.EXTRA = CN(new_allowed=True) #增加额外配置信息
# training parametes
config.TRAIN = CN(new_allowed=True) #增加额外配置信息
config.TRAIN.IMAGE_SIZE = [224, 224]
config.TRAIN.EPOCH = 30
config.TRAIN.BATCH_SIZE = 16
project/test.yaml
MODEL:
NAME: Lenet
EXTRA:
FINAL_CONV_KERNEL: 1
STAGE1:
NUM_MODULES: 1
NUM_RANCHES: 1
OUTPUT_DIR: output_folder/
TRAIN:
EPOCH: 50
IMAGE_SIZE:
- 112
- 224
LR: 0.1
project/demo.py
from config.default import config
import argparse
def get_cfg_defaults(config):
"""Get a yacs CfgNode object with default values.
Return the copy of config so that the defaults will not be altered"""
return config.clone()
def update_config(cfg, args):
cfg_new = get_cfg_defaults(cfg)
cfg_new.defrost()
cfg_new.merge_from_file(args.cfg)
if args.opts:
cfg_new.merge_from_list(args.opts)
cfg_new.freeze()
return cfg_new
if __name__ == '__main__':
args = argparse.Namespace(cfg='test.yaml',opts=['TRAIN.BATCH_SIZE',32])
config_new = update_config(config,args)
print(config_new)
print('-'*50)
print(config)
显示结果
LOG_DIR: output_folder/log_folder/
MODEL:
EXTRA:
FINAL_CONV_KERNEL: 1
STAGE1:
NUM_MODULES: 1
NUM_RANCHES: 1
NAME: Lenet
PRETRAINED:
OUTPUT_DIR: output_folder/
TRAIN:
BATCH_SIZE: 32
EPOCH: 50
IMAGE_SIZE: [112, 224]
LR: 0.1
--------------------------------------------------
LOG_DIR: output_folder/log_folder/
MODEL:
EXTRA:
NAME: Resnet
PRETRAINED:
OUTPUT_DIR: output_folder/
TRAIN:
BATCH_SIZE: 16
EPOCH: 30
IMAGE_SIZE: [224, 224]
四、深度学习项目配置参数系列文章链接
文章标题————————       &nbs | 链接 ———————— |
---|---|
深度学习项目配置参数(一) argparse.ArgumentParser的使用教程 | https://blog.csdn.net/li1784506/article/details/139803120?spm=1001.2014.3001.5502 |
深度学习项目配置参数(二) yacs库的使用教程 | https://blog.csdn.net/li1784506/article/details/139831426?spm=1001.2014.3001.5502 |
深度学习项目配置参数(三)yaml和json配置文件的使用 | https://blog.csdn.net/li1784506/article/details/139857940?spm=1001.2014.3001.5502 |