import tensorflow as tf
import pandas as pd
import os
from tensorboard.backend.event_processing import event_accumulator
from tensorflow.python.lib.io import tf_record
from tensorflow.core.util import event_pb2
[docs]def get_folder_name(path, prefix=''):
"""
Look at the current path and change the name of the experiment
if it is repeated
Args:
path (string): folder path
prefix (string): prefix to add
Returns:
string: unique path to save the experiment
"""
if prefix == '':
prefix = path.split('/')[-1]
path = '/'.join(path.split('/')[:-1])
folders = [f for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))]
if prefix not in folders:
path = os.path.join(path, prefix)
elif not os.path.isdir(os.path.join(path, '{}_0'.format(prefix))):
path = os.path.join(path, '{}_0'.format(prefix))
else:
n = sorted([int(f.split('_')[-1]) for f in folders if '_' in f[-2:]])[-1]
path = os.path.join(path, '{}_{}'.format(prefix, n+1))
return path
[docs]def standardize(tensor, axis=0, return_mean=False):
"""
Standardize a tensor subtracting the mean
Args:
tensor (1-dim tensorflow tensor): values
axis (int): axis on which we calculate the mean
return_mean (bool): output the mean of the tensor
turning on the original scale
Returns:
tensor (1-dim tensorflow tensor): standardize tensor
"""
mean_value = tf.reduce_mean(tensor, axis, name='mean_value')
z = tensor - tf.expand_dims(mean_value, axis)
if return_mean:
return z, mean_value
else:
return z
[docs]def my_summary_iterator(path):
for r in tf_record.tf_record_iterator(path):
yield event_pb2.Event.FromString(r)
[docs]def get_metrics(path_logs, metric_name='epoch_loss'):
train_logs = [x for x in os.listdir(path_logs) if x.endswith('.v2')][0]
path_train = os.path.join(path_logs, train_logs)
ea = event_accumulator.EventAccumulator(path_train)
ea.Reload()
# print(ea.Tags())
metrics = pd.DataFrame([(w,s,tf.make_ndarray(t))for w,s,t in ea.Tensors(metric_name)],
columns=['wall_time', 'step', 'value'])
return metrics