gxtoml——Make your deep learning setup easy

这是一个Python代码库,可以帮助深度学习开发者更快的进行项目参数配置。

介绍

一个完整的深度学习项目中,往往需要在运行代码之前设置很多的参数。目前流行的方法是使用argparse或者tensorflow自带的FLAGS类来完成。在运行代码的时候,可以修改程序入口或者以附加命令行参数的方式完成参数的设置。

这样做优缺点都很明显。优点就是在代码中以访问对象属性的形式,比如arg.batch_size来访问参数。缺点就在于,参数非常多的时候,会有十几二十行来进行参数配置。显得非常冗余。比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
parser = argparse.ArgumentParser(description='Train a memory neural network')
parser.add_argument('--edim', type=int, default=150,
help='internal state dimension [150]')
parser.add_argument('--lindim', type=int, default=75,
help='linear part of the state [75]')
parser.add_argument('--nhop', type=int, default=6,
help='number of hops [6]')
parser.add_argument('--mem_size', type=int, default=100,
help='memory size [100]')
parser.add_argument('--batch_size', type=int, default=128,
help='batch size [128]')
parser.add_argument('--nepoch', type=int, default=100,
help='number of epoch to use during training [100]')
parser.add_argument('--init_lr', type=float, default=0.01,
help='initial learning rate [0.01]')
parser.add_argument('--init_hid', type=float, default=0.1,
help='initial internal state value [0.1]')
parser.add_argument('--init_std', type=float, default=0.05,
help='weight initialization std [0.05]')
parser.add_argument('--max_grad_norm', type=float, default=50,
help='clip gradients to this norm [50]')
parser.add_argument('--data_dir', type=str, default='data',
help='data directory [data]')
parser.add_argument('--checkpoint_dir', type=str, default='checkpoints',
help='checkpoint directory [checkpoints]')
parser.add_argument('--data_name', type=str, default='ptb',
help='data set name [ptb]')
parser.add_argument('--is_test', type=bool, default=False,
help='True for testing, False for Training [False]')
parser.add_argument('--show', type=bool, default=False,
help='print progress [False]')
args = parser.parse_args()

没办法快速修改想要的参数。

这时候,最直观的想法就是创建一个配置文件来解决问题。要改直接改配置文件就完事了嘛。

Why TOML

常用的配置文件格式有jsonYAML和后起之秀的TOML

前两者应用范围非常广泛,但都是给计算机看的。json眼花缭乱的大括号还是没有解决可读性问题,YAML起步成本非常高。

TOML这这里面最正常的选择,只要你愿意,直接将文件写成k-v的方式就可以了。
上面的配置文件可以改写成下面的形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
gpu = true
test = false
show = true
data_name = "ptb"

[init]
lr = 0.01
hidVal = 0.1
weight_std = 0.05

[dirs]
data_dir = "data"
checkpoint_dir = "checkpoints"

[model]
hop = 3
edim = 150
lindim = 75
epoch = 5
max_grad_norm = 50

[size]
mem = 100
batch = 128

Using TOML in Python

这时候问题又来了,现有的python库只会将TOML转成字典的形式。访问参数的时候需要频繁的index操作,还是不够方便,毕竟要写几次中括号和引号,比如使用cfg['size']['mem']来访问mem_size这个参数。

如果能转换成对象的方式就爽了,直接用.就可以完成所有事情。

gxtoml就是干这件事的。

Install

安装方式有两种,whl文件或者pip网路安装。

whl

在项目主页Release· gawainx/gx-toml下载whl到本地。

执行pip install gxtoml-0.1a1-py2.py3-none-any.whl完成安装

pip online

键入pip install gxtoml

使用清华软件源的需要等清华更新上游之后才能搜索安装。

使用

1
2
3
4
5
6
7
8
9
10
In [1]: import gxtoml
In [2]: cfg = gxtoml.config('sample.toml')
In [10]: cfg.gpu
Out[10]: True

In [11]: cfg.model.hop
Out[11]: 3

In [13]: cfg.dirs.data_dir
Out[13]: 'data'

Beyond

其实背后的原理非常的简单。这个库出发点只是让我自己尽快脱离字典地狱和疯狂的argparse而快速开发的,因此并没有考虑性能表现等因素,只能说是做了一点微小的工作。

更多功能等后面慢慢完善。

Reference