2018-05-06 22:11:49 +08:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# @Time : 2018/4/25 20:28
|
|
|
|
# @Author : Adesun
|
|
|
|
# @Site : https://github.com/Adesun
|
|
|
|
# @File : log_parser.py
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import platform
|
|
|
|
import re
|
|
|
|
import sys
|
2018-05-07 05:45:26 +08:00
|
|
|
|
2018-08-05 12:18:27 +08:00
|
|
|
# set non-interactive backend default when os is not windows
|
|
|
|
if sys.platform != 'win32':
|
|
|
|
import matplotlib
|
|
|
|
matplotlib.use('Agg')
|
|
|
|
|
|
|
|
import matplotlib.pyplot as plt
|
2018-05-06 22:11:49 +08:00
|
|
|
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
|
|
|
|
|
|
|
|
|
|
|
|
def get_file_name_and_ext(filename):
|
|
|
|
(file_path, temp_filename) = os.path.split(filename)
|
|
|
|
(file_name, file_ext) = os.path.splitext(temp_filename)
|
|
|
|
return file_name, file_ext
|
|
|
|
|
|
|
|
|
|
|
|
def show_message(message, stop=False):
|
|
|
|
print(message)
|
|
|
|
if stop:
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
|
|
def parse_args():
|
|
|
|
parser = argparse.ArgumentParser(description="training log parser by DeepKeeper ")
|
|
|
|
parser.add_argument('--source-dir', dest='source_dir', type=str, default='./',
|
|
|
|
help='the log source directory')
|
|
|
|
parser.add_argument('--save-dir', dest='save_dir', type=str, default='./',
|
|
|
|
help='the directory to be saved')
|
|
|
|
parser.add_argument('--csv-file', dest='csv_file', type=str, default="",
|
|
|
|
help='training log file')
|
|
|
|
parser.add_argument('--log-file', dest='log_file', type=str, default="",
|
|
|
|
help='training log file')
|
|
|
|
parser.add_argument('--show', dest='show_plot', type=bool, default=False,
|
|
|
|
help='whether to show')
|
|
|
|
return parser.parse_args()
|
|
|
|
|
|
|
|
|
|
|
|
def log_parser(args):
|
|
|
|
if not args.log_file:
|
|
|
|
show_message('log file must be specified.', True)
|
|
|
|
|
|
|
|
log_path = os.path.join(args.source_dir, args.log_file)
|
|
|
|
if not os.path.exists(log_path):
|
|
|
|
show_message('log file does not exist.', True)
|
|
|
|
|
|
|
|
file_name, _ = get_file_name_and_ext(log_path)
|
|
|
|
log_content = open(log_path).read()
|
|
|
|
|
|
|
|
iterations = []
|
|
|
|
losses = []
|
|
|
|
fig, ax = plt.subplots()
|
2018-08-05 12:18:27 +08:00
|
|
|
# set area we focus on
|
|
|
|
ax.set_ylim(0, 8)
|
2018-05-06 22:11:49 +08:00
|
|
|
|
2018-08-05 12:18:27 +08:00
|
|
|
major_locator = MultipleLocator()
|
2018-05-06 22:11:49 +08:00
|
|
|
minor_locator = MultipleLocator(0.5)
|
|
|
|
ax.yaxis.set_major_locator(major_locator)
|
|
|
|
ax.yaxis.set_minor_locator(minor_locator)
|
|
|
|
ax.yaxis.grid(True, which='minor')
|
|
|
|
|
2018-08-05 12:18:27 +08:00
|
|
|
pattern = re.compile(r"([\d].*): .*?, (.*?) avg")
|
|
|
|
# print(pattern.findall(log_content))
|
2018-05-06 22:11:49 +08:00
|
|
|
matches = pattern.findall(log_content)
|
2018-08-05 12:18:27 +08:00
|
|
|
# print(type(matches[0]))
|
2018-05-06 22:11:49 +08:00
|
|
|
counter = 0
|
|
|
|
log_count = len(matches)
|
|
|
|
|
|
|
|
if args.csv_file != '':
|
|
|
|
csv_path = os.path.join(args.save_dir, args.csv_file)
|
|
|
|
out_file = open(csv_path, 'w')
|
|
|
|
else:
|
|
|
|
csv_path = os.path.join(args.save_dir, file_name + '.csv')
|
|
|
|
out_file = open(csv_path, 'w')
|
|
|
|
|
|
|
|
for match in matches:
|
|
|
|
counter += 1
|
|
|
|
if log_count > 200:
|
|
|
|
if counter % 200 == 0:
|
|
|
|
print('parsing {}/{}'.format(counter, log_count))
|
|
|
|
else:
|
|
|
|
print('parsing {}/{}'.format(counter, log_count))
|
|
|
|
iteration, loss = match
|
|
|
|
iterations.append(int(iteration))
|
|
|
|
losses.append(float(loss))
|
|
|
|
out_file.write(iteration + ',' + loss + '\n')
|
|
|
|
|
|
|
|
ax.plot(iterations, losses)
|
|
|
|
plt.xlabel('Iteration')
|
|
|
|
plt.ylabel('Loss')
|
2018-08-05 12:18:27 +08:00
|
|
|
plt.tight_layout()
|
2018-05-06 22:11:49 +08:00
|
|
|
|
2018-08-05 12:18:27 +08:00
|
|
|
# saved as svg
|
|
|
|
save_path = os.path.join(args.save_dir, file_name + '.svg')
|
|
|
|
plt.savefig(save_path, dpi=300, format="svg")
|
2018-05-06 22:11:49 +08:00
|
|
|
if args.show_plot:
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
args = parse_args()
|
|
|
|
log_parser(args)
|