前几天看到一个群里有人问,AllenNLP在控制台使用命令train时,什么时候建立的词典,于是今天浏览了一下AllenNLP的代码。
在train.py
的class Train(Subcommand):
类里,这里用parser
定义了一些命令行的输入指令。在控制台输入allennlp train XXX -s XXX
之后,读取配置文件.json,然后进入到
train_model(params, serialization_dir, file_friendly_logging, recover, force)
这个方法里,帮你进行了初始化的工作,比如说
prepare_environment(params) #设置seed
create_serialization_dir(params, serialization_dir, recover, force) #创建输出的目录
check_for_gpu(cuda_device) #检查GPU
这些零碎的工作完成之后,进入到
TrainerPieces.from_params(params, serialization_dir, recover)
在这个方法里,就可以看到
training_util.datasets_from_params(params) #在这里读取数据集
读取完数据集后,创建词典,如果命令行中加了-r
就会使用之前已经创建好的词典。在json配置文件里如果没有定义词典的属性的话,使用默认的参数。
if recover and os.path.exists(os.path.join(serialization_dir, "vocabulary")):
vocab = Vocabulary.from_files(os.path.join(serialization_dir, "vocabulary"))
else:
vocab = Vocabulary.from_params(
params.pop("vocabulary", {}),
(instance for key, dataset in all_datasets.items()
for instance in dataset
if key in datasets_for_vocab_creation)
) #这里用读取的数据建立词典
保存词典到文件。
vocab.save_to_files(os.path.join(serialization_dir, "vocabulary"))
总结
AllenNLP的工程搭建应该可以有三种方式:
- 所有的代码都自己完成,比如vocabulary,BucketIterator,trainer。但是想要改参数的话,不够方便。
- 手动调用from_params(),对所有东西设置属性。
- 只用写json配置文件,自己的模型,数据集的读取等类,其他工作由AllenNLP的代码辅助完成。这样就可以节省时间,专注于模型和数据的读取。
但是
手写json配置文件是一件困难的事情,可以有两种方法辅助完成。
- 参考AllenNLP已经完成的配置文件,在training_config中。
- 命令行中用
allennlp configure --port 8123
,打开网页,在界面上设置。这个在windows中不能使用,只能在ubuntu中用。