我尝试在allenlp v2.0.1中实现一个主动学习过程。然而,由于目前GradientDescentTrainer
的实施,我无法继续对新一批Instance
进行培训。
该模型(也使用AllenNLP进行训练)已经在初始训练数据集上完成了预定义的epoch数的训练。我使用Model.from_archive
方法恢复模型,并使用Trainer.from_params
静态构造函数为其实例化Trainer
。
此后,当我试图通过调用trainer.train()
继续训练新一批Instance
时,由于_try_train
方法中的以下代码片段,它跳过了训练,
for epoch in range(epoch_counter, self._num_epochs)
这是因为epoch_counter
被恢复为5,这是之前在初始训练数据上训练的结果。这是它的相关代码片段,
def _try_train(self) -> Tuple[Dict[str, Any], int]:
try:
epoch_counter = self._restore_checkpoint()
self._num_epochs
也是5,我认为这是我的。jsonnet训练配置文件中定义的epoch的数量。
简单地说,我的要求是加载一个已经训练过的AllenNLP模型,并继续在新一批实例上训练它(实际上是单个实例,我将使用SimpleDataLoader
加载)
我还附上了下面培训师的配置。我使用的模型是围绕BasicClassifier的自定义包装器,仅用于记录附加指标。
提前感谢。
"trainer": {
"num_epochs": 5,
"patience": 1, // for early stopping
"grad_norm": 5.0,
"validation_metric": "+accuracy",
"optimizer": {
"type": "adam",
"lr": 0.001
},
"callbacks": [
{
"type": "tensorboard"
}
]
}
几点建议:
- 在运行命令行或通过脚本 时不要打开恢复标志
- 为您的第二次培训指定一个不同的序列化目录