最近在写代码,发现随着网络的增加,代码变得越来越冗余,所以就想着写一个网络的配置文件,把网络的配置放到一个文件中,而不再主函数中,这样代码开起来就好看了,调试的时候也方便了。之前写过一篇神经网络配置文件的文章:config配置文件原理及使用,但是这篇文章不适用于我现在的情况,这篇文章需要写一个config.py
文件,然后再写一个config.yaml
文件,有些网络的配置是在config.py
文件中写的,我想的是针对于某个网络单独建立一下config.yaml
文件,把他的配置写到里面,然后在更新到config.py
文件中,可是这样写完报错,原因就是config.yaml
文件中定义的变量必须在config.py
文件中有定义,但是这样针对目前我的工程有多个神经网络,就不符合解决代码冗长的初衷了,所以就选择了本文的方案,这里记录一下方便以后查阅。
yaml配置文件
- yaml介绍
- 基本语法
- 数据类型
- 安装PyYAML
- PyYAML使用
- 参考资料
yaml介绍
YAML
是"YAML Ain't a Markup Language
"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language
"仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
YAML是一种数据序列化格式,优点是:
- 对于人类可读性更友好
- 方便与脚本语言进行交互使用
基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- #表示注释
数据类型
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
安装PyYAML
pip install PyYAML
安装的时候总是报错:
本以为是网络的问题,重复运行上面的安装代码好几次,还是不行,这就有可能不是网络的问题了,然后就尝试着更新一下库:
sudo apt-get update
然后再尝试着安装,结果一次成功:
PyYAML使用
首先在config.yaml
配置文件中定义可配置信息:
DATA_AUGMENTATION : 5
KERNEL_L_CONV1 : 1
EMBED_DIM_T : 150
EMBED_DIM_C : 62
HEADS_T : 5
HEADS_C : 2
ACT_ATTEN : 'elu'
DROPOUT_ATTEN : 0.3
DROPOUTRATE : 0.3
KERNEL_L_SEPARABLE : 3
DEPTHWISE : 5
AVGPOOL_DEPTHWISE : 2
AVGPOOL_SEPARABLE : 4
AVGPOOL_SIZE_CLA : 1
FC_IN_CLA : 25
N_CLASSES : 3
使用PyYAML模块解析config.yaml配置文件,主要步骤如下:
- 使用
open()
打开config.yaml配置文件,然后使用read()
读取 - 使用
yaml.load(stream, Loader)
加载读取的配置文件数据,生成一个y的对象 - 使用字典的形式访问生成的y对象中的配置信息
def build_SelfAtten_Mixer(yaml_path):
# 使用open()函数读取config.yaml文件
yaml_file = open(yaml_path, "r", encoding="utf-8")
# 读取文件中的内容
file_data = yaml_file.read()
# 加载数据流,返回字典类型数据
config = yaml.load(file_data, Loader=yaml.FullLoader)
"""build SelfAtten_Mixer model from config"""
model = SelfAtten_Mixer(data_augmentation = config['DATA_AUGMENTATION'],
kernel_L_conv1 = config['KERNEL_L_CONV1'],
embed_dim_T = config['EMBED_DIM_T'],
embed_dim_C = config['EMBED_DIM_C'],
heads_T = config['HEADS_T'],
heads_C = config['HEADS_C'],
act_atten = config['ACT_ATTEN'],
dropout_atten = config['DROPOUT_ATTEN'],
dropoutRate = config['DROPOUTRATE'],
kernel_L_separable = config['KERNEL_L_SEPARABLE'],
depthwise = config['DEPTHWISE'],
avgpool_depthwise = config['AVGPOOL_DEPTHWISE'],
avgpool_separable = config['AVGPOOL_SEPARABLE'],
avgpool_size_cla = config['AVGPOOL_SIZE_CLA'],
fc_in_cla = config['FC_IN_CLA'],
n_classes = config['N_CLASSES'],)
return model
参考资料
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
Python的logging日志工具 & 深度学习项目yaml配置文件