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
常用的配置文件格式有json
,YAML
和后起之秀的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