From ec6b77c5da82c6ed078016aad20e3d3a41df65a0 Mon Sep 17 00:00:00 2001 From: tabergma Date: Wed, 28 Nov 2018 17:37:35 +0100 Subject: [PATCH] GH-212: Add file handler to logger in training. --- flair/__init__.py | 1 - flair/trainers/trainer.py | 24 +++++++++++++++--------- flair/training_utils.py | 7 +++++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/flair/__init__.py b/flair/__init__.py index de263bb89b..5380ce37a4 100644 --- a/flair/__init__.py +++ b/flair/__init__.py @@ -5,7 +5,6 @@ import sys import logging -import warnings logger = logging.getLogger(__name__) diff --git a/flair/trainers/trainer.py b/flair/trainers/trainer.py index 578fcb6ec9..257ac54606 100644 --- a/flair/trainers/trainer.py +++ b/flair/trainers/trainer.py @@ -120,7 +120,13 @@ def train(self, **kwargs ) -> dict: - log_line() + fh = logging.FileHandler(base_path / 'training.log') + fh.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)-15s %(message)s') + fh.setFormatter(formatter) + log.addHandler(fh) + + log_line(log) log.info(f'Evaluation method: {evaluation_metric.name}') # cast string to Path @@ -170,7 +176,7 @@ def train(self, previous_learning_rate = learning_rate for epoch in range(0 + self.epoch, max_epochs + self.epoch): - log_line() + log_line(log) # bad_epochs = scheduler.num_bad_epochs bad_epochs = 0 @@ -187,9 +193,9 @@ def train(self, # stop training if learning rate becomes too small if learning_rate < 0.0001: - log_line() + log_line(log) log.info('learning rate too small - quitting training!') - log_line() + log_line(log) break if not test_mode: @@ -227,7 +233,7 @@ def train(self, self.model.eval() - log_line() + log_line(log) log.info(f'EPOCH {epoch + 1}: lr {learning_rate:.4f} - bad epochs {bad_epochs}') dev_metric = None @@ -288,7 +294,7 @@ def train(self, self.model.save(base_path / 'final-model.pt') except KeyboardInterrupt: - log_line() + log_line(log) log.info('Exiting from training early.') if not param_selection_mode: log.info('Saving model ...') @@ -307,7 +313,7 @@ def final_test(self, evaluation_metric: EvaluationMetric, mini_batch_size: int): - log_line() + log_line(log) log.info('Testing using best model ...') self.model.eval() @@ -329,12 +335,12 @@ def final_test(self, f'{test_metric.precision(class_name):.4f} - recall: {test_metric.recall(class_name):.4f} - ' f'accuracy: {test_metric.accuracy(class_name):.4f} - f1-score: ' f'{test_metric.f_score(class_name):.4f}') - log_line() + log_line(log) # if we are training over multiple datasets, do evaluation for each if type(self.corpus) is MultiCorpus: for subcorpus in self.corpus.corpora: - log_line() + log_line(log) self._calculate_evaluation_results_for(subcorpus.name, subcorpus.test, evaluation_metric, embeddings_in_memory, mini_batch_size, base_path / 'test.tsv') diff --git a/flair/training_utils.py b/flair/training_utils.py index 1875b79e1b..be071570b5 100644 --- a/flair/training_utils.py +++ b/flair/training_utils.py @@ -232,5 +232,8 @@ def convert_labels_to_one_hot(label_list: List[List[str]], label_dict: Dictionar return [[1 if l in labels else 0 for l in label_dict.get_items()] for labels in label_list] -def log_line(): - log.info('-' * 100) +def log_line(logger = None): + if logger is not None: + logger.info('-' * 100) + else: + log.info('-' * 100)