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
就可以修改配置文件。