配置管理工具——omegaconf

omegaconf是专门用来解析.yaml文件,支持对yaml中设置参数的变量插值类型检查默认值处理层次化配置。参考:omegaconf,一个超强的 Python 库!_omeaconf-CSDN博客

主要介绍一下几个常用到的功能(持续补充...):

1. 导入.yaml

假设你的工作目录下有两个文件,一个是config.yaml,一个是main.py。yaml文件里面的内容:

# config.yaml
model:
  name: resnet
  num_layers: 18
training:
  batch_size: 64
  learning_rate: 0.001

可以使用如下代码解析并导入.yaml文件:

from omegaconf import OmegaConf

# 加载配置文件
config = OmegaConf.load("config.yaml")
print(type(config))
# <class 'omegaconf.dictconfig.DictConfig'>

# 将配置文件转换为 Python 字典
config_dict = OmegaConf.to_container(config, resolve=True)
print(type(config_dict))
# <class 'dict'>

# 使用.访问里面的属性
print(OmegaConf.to_yaml(config))
# model:
#   name: resnet50
#   layers: 18
# training:
#   batch_size: 64
#   epochs: 10

解释一下`OmegaConf.save`中的参数`resolve`的含义,`resolve=True`意味着允许插值,举个例子,比如你的配置文件里面的某个参数引用了本配置文件的其他参数,比如:

# config.yaml
model:
  name: resnet
  num_layers: 20
  heads_num: 34
training:
  batch_size: ${model.num_layers}
  learning_rate: 0.001
  optimizer: Adam

使用`resolve=True`后,字典是

{'model': {'name': 'resnet', 'num_layers': 20, 'heads_num': 34}, 'training': {'batch_size': 20, 'learning_rate': 0.001, 'optimizer': 'Adam'}}

可以看到,`batch_size`变成了和`num_layers`一样的值。

2. 修改后存入.yaml文件

分以下几种情况:

一种是创建字典,然后用`OmegaConf`存到.yaml“:

from omegaconf import OmegaConf

my_dict = {
    "model":{
        "name": "resnet",
        "num_layers": 18
    },
    "training":{
        "batch_size": 64,
        "learning_rate": 0.001
    }
}
        
# 创建配置
config = OmegaConf.create(my_dict)
print(type(config))
# <class 'omegaconf.dictconfig.DictConfig'>

# 存到.yaml文件
OmegaConf.save(config, "mydict.yaml")

一种是在原来的基础上修改了某个参数值,再存储:

from omegaconf import OmegaConf

# 加载配置文件
config = OmegaConf.load("config.yaml")
print(type(config))
# <class 'omegaconf.dictconfig.DictConfig'>

config.model.num_layers = 20

# 存到.yaml文件
OmegaConf.save(config, "config.yaml")

还有一种是有两个不同的config文件,比如config1.yaml和config2.yaml,config2.yaml对config1.yaml某些值进行了修改,并且包含一些config1.yaml中没有的参数,那么可以通过下面的代码进行合并。比如config1.yaml和config2.yaml的内容分别是:

# config1.yaml
model:
  name: resnet
  num_layers: 18
  heads_num: 34
training:
  batch_size: 64
  learning_rate: 0.001
# config2.yaml
model:
  name: resnet
  num_layers: 20
training:
  batch_size: 64
  learning_rate: 0.001
  optimizer: Adam
from omegaconf import OmegaConf

# 加载配置文件
config1 = OmegaConf.load("config1.yaml")
config2 = OmegaConf.load("config2.yaml")

config1 = OmegaConf.merge(config1, config2)

# 存到.yaml文件
OmegaConf.save(config1, "config1.yaml")

则合并之后的config1就变成了:

# config1.yaml
model:
  name: resnet
  num_layers: 20
  heads_num: 34
training:
  batch_size: 64
  learning_rate: 0.001
  optimizer: Adam

3. 命令行输入参数

OmegaConf还支持从命令行中接收参数。

# config.yaml
model:
  name: resnet50
  layers: 50

training:
  batch_size: 64
  epochs: 10
  optimizer: adam

通过下面的代码:

from omegaconf import OmegaConf
import sys

# 导入配置参数
config = OmegaConf.load("config.yaml")

# 解析命令行参数
overrides = OmegaConf.from_cli(sys.argv[1:])

# 将命令行参数与配置文件合并
config = OmegaConf.merge(config, overrides)

print(config)
python main.py model.layers=29

就可以修改配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值