前言
学过AI的都知道训练一个模型需要调整很多参数,为了有效的管理这些参数、不至于让代码的参数写的乱七八糟,有必要写一套控制参数的模板。
argparser
argparser是python当中的参数解析器,在NLP当中主要是用来接受和使用参数的。一个使用它的简单流程如下:
- 创建参数解析器parser
- 给解析器parser添加参数,用来接收参数,可以是模型参数、训练参数等
- 将参数解析器接收到的参数解析出来放到args中,后续使用也从args中取参数即可
示例:
# 1.创建参数解析器parser
parser = argparse.ArgumentParser()
# 2.给解析器parser添加参数,用来接收参数
parser.add_argument('--test','-t', default='test ok!')
# 3.将参数解析器接收到的参数解析出来放到args中
args = parser.parse_args()
print(args)
print(args.test)
关于argparser的更多用法,感兴趣可以自行搜索。
参数控制模板
import argparse
class Config:
"""model config"""
def __init__(self) -> None:
self.parser = self.setup_parser()
self.args = vars(self.parser.parse_args())
self.__dict__.update(self.args)
def setup_parser(self):
parser = argparse.ArgumentParser()
parser.add_argument('--mode','-m', default='fintuned')
return parser
if __name__ == '__main__':
config = Config()
print(config)
print(config.mode)
可能有些人会疑惑直接按照上面argparser的三步走接受参数不久行了吗?
干嘛还加这两行:
self.args = vars(self.parser.parse_args())
self.__dict__.update(self.args)
解释一下,第一行的self.parser.parse_args()是上面argparser三步走中的第3步得到的结果,使用vars可以将这个结果转换成字典的形式,即参数:参数对应的值这种形式。
第二行的self.__dict__.update(self.args)是把上面得到的字典更新到自己的类里面,后面实例化之后就可以直接通过对象取到对应参数了。那取得的效果是啥呢?
我们看一下不加入这两行会发生什么?
import argparse
class Config:
"""model config"""
def __init__(self) -> None:
self.parser = self.setup_parser()
self.args = self.parser.parse_args()
# self.args = vars(self.parser.parse_args())
# self.__dict__.update(self.args)
def setup_parser(self):
parser = argparse.ArgumentParser()
parser.add_argument('--mode','-m', default='fintuned')
return parser
if __name__ == '__main__':
config = Config()
print(config)
print(config.mode)
报错,原因是因为Config类的对象config没有mode属性,事实上参数存储在config.args中了,因此取出“mode”参数应该用confgi.args.mode。
但是这样很麻烦,我们想直接通过config取参数,即config.mode,只需要加上上面两行即可!也就是最开始的模板,结果如下:
大功告成!以后写NLP或者其他AI代码,只需要用这一套模板,在其他python文件中实例化该类,就可以很方便的管理我们的参数了。