Helper Module for Deep Learning.
Source code for pynet.history
# -*- coding: utf-8 -*-
##########################################################################
# NSAp - Copyright (C) CEA, 2019
# Distributed under the terms of the CeCILL-B license, as published by
# the CEA-CNRS-INRIA. Refer to the LICENSE file or to
# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
# for details.
##########################################################################
"""
Module that provides logging utilities.
"""
# System import
import os
import logging
import collections
import time
import datetime
import pickle
# Third party import
import numpy as np
from tabulate import tabulate
# Global parameters
logger = logging.getLogger("pynet")
[docs]class History(object):
""" Track training progress by following the some metrics.
"""
[docs] def __init__(self, name, verbose=0):
""" Initilize the class.
Parameters
----------
name: str
the object name.
verbose: int, default 0
control the verbosity level.
"""
self.name = name
self.verbose = verbose
self.step = None
self.metrics = set()
self.history = collections.OrderedDict()
def __repr__(self):
""" Display the history.
"""
table = []
for step in self.steps:
values = []
for metric in self.metrics:
values.append(self.history[step][metric])
table.append([step] + values)
return tabulate(table, headers=self.metrics)
[docs] def log(self, step, **kwargs):
""" Record some metrics at a specific step.
Example:
state = History()
state.log(1, loss=1., accuracy=0.)
If logging the same metrics for one specific step, new values
overwrite older ones.
Parameters
----------
step: int or uplet
The step name: we can use a tuple to log the fold, the epoch
or the step within the epoch.
kwargs
The metrics to be logged.
"""
if not isinstance(step, (int, tuple)):
raise ValueError("Step must be an int or a tuple.")
self.step = step
self.metrics |= set(kwargs.keys())
if step not in self.history:
self.history[step] = {}
for key, val in kwargs.items():
self.history[step][key] = val
self.history[step]["__timestamp__"] = time.time()
@property
def steps(self):
""" Returns a list of all steps.
"""
return list(self.history.keys())
def __getitem__(self, metric):
steps = self.steps
data = np.array([self.history[step].get(metric) for step in steps])
return steps, data
[docs] def summary(self):
last_step = self.steps[-1]
msg = "{:6s} {:15s}".format(self.name, repr(last_step))
for key in self.metrics:
msg += "{:6s}:{:10f} ".format(key, self.history[last_step][key])
msg += "{}".format(str(self.get_total_time()))
logger.info(msg)
[docs] def get_total_time(self):
""" Returns the total period between the first and last steps.
"""
seconds = (
self.history[self.steps[-1]]["__timestamp__"]
- self.history[self.steps[0]]["__timestamp__"])
return datetime.timedelta(seconds=seconds)
[docs] def save(self, outdir, fold, epoch):
outfile = os.path.join(
outdir, "{0}_{1}_epoch_{2}.pkl".format(self.name, fold, epoch))
with open(outfile, "wb") as open_file:
pickle.dump(self, open_file)
[docs] @classmethod
def load(cls, file_name):
with open(file_name, "rb") as open_file:
return pickle.load(open_file)
Follow us
© 2019, pynet developers .
Inspired by AZMIND template.
Inspired by AZMIND template.