深度学习项目配置参数(二) yacs库的使用教程

引 言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_filenameyaml文件名。
示例:
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)

三、深度学习项目参数配置完整程序示例

  1. 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
  1. 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
  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]

四、深度学习项目配置参数系列文章链接

文章标题————————&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值