from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import datetime import time import logging from collections import OrderedDict ''' Utilities for logging experiment run stats, such as accuracy and loss over time for different runs. Runtime arguments are stored in the log. ''' class ModelTrainerLog(): def __init__(self, expname, runtime_args): now = datetime.datetime.fromtimestamp(time.time()) self.experiment_id = now.strftime('%Y%m%d_%H%M%S') self.filename = "%s_%s.log" % (expname, self.experiment_id) self.logstr("# %s" % str(runtime_args)) self.headers = None self.start_time = time.time() self.last_time = self.start_time self.last_input_count = 0 def logstr(self, str): with open(self.filename, "a") as f: f.write(str + "\n") f.close() logging.getLogger("experiment_logger").info(str) def log(self, input_count, batch_count, additional_values): logdict = OrderedDict() delta_t = time.time() - self.last_time delta_count = input_count - self.last_input_count self.last_time = time.time() self.last_input_count = input_count logdict['time'] = time.time() - self.start_time logdict['input_counter'] = input_count logdict['batch_count'] = batch_count if delta_t > 0: logdict['inputs_per_sec'] = delta_count / delta_t else: logdict['inputs_per_sec'] = 0.0 for k in sorted(additional_values.keys()): logdict[k] = additional_values[k] # Write the headers if they are not written yet if self.headers is None: self.headers = logdict.keys()[:] self.logstr(",".join(self.headers)) self.logstr(",".join([str(v) for v in logdict.values()]))