| from tensorboard.backend.event_processing import event_accumulator |
|
|
| import os |
| from shutil import copy2 |
| from re import search as RSearch |
| import pandas as pd |
| from ast import literal_eval as LEval |
|
|
| weights_dir = 'logs/weights/' |
|
|
| def find_biggest_tensorboard(tensordir): |
| try: |
| files = [f for f in os.listdir(tensordir) if f.endswith('.0')] |
| if not files: |
| print("No files with the '.0' extension found!") |
| return |
|
|
| max_size = 0 |
| biggest_file = "" |
|
|
| for file in files: |
| file_path = os.path.join(tensordir, file) |
| if os.path.isfile(file_path): |
| file_size = os.path.getsize(file_path) |
| if file_size > max_size: |
| max_size = file_size |
| biggest_file = file |
|
|
| return biggest_file |
|
|
| except FileNotFoundError: |
| print("Couldn't find your model!") |
| return |
|
|
| def main(model_name, save_freq, lastmdls): |
| global lowestval_weight_dir, scl |
|
|
| tensordir = os.path.join('logs', model_name) |
| lowestval_weight_dir = os.path.join(tensordir, "lowestvals") |
| |
| latest_file = find_biggest_tensorboard(tensordir) |
| |
| if latest_file is None: |
| print("Couldn't find a valid tensorboard file!") |
| return |
| |
| tfile = os.path.join(tensordir, latest_file) |
| |
| ea = event_accumulator.EventAccumulator(tfile, |
| size_guidance={ |
| event_accumulator.COMPRESSED_HISTOGRAMS: 500, |
| event_accumulator.IMAGES: 4, |
| event_accumulator.AUDIO: 4, |
| event_accumulator.SCALARS: 0, |
| event_accumulator.HISTOGRAMS: 1, |
| }) |
|
|
| ea.Reload() |
| ea.Tags() |
|
|
| scl = ea.Scalars('loss/g/total') |
|
|
| listwstep = {} |
| |
| for val in scl: |
| if (val.step // save_freq) * save_freq in [val.step for val in scl]: |
| listwstep[float(val.value)] = (val.step // save_freq) * save_freq |
|
|
| lowest_vals = sorted(listwstep.keys())[:lastmdls] |
|
|
| sorted_dict = {value: step for value, step in listwstep.items() if value in lowest_vals} |
| |
| return sorted_dict |
|
|
| def selectweights(model_name, file_dict, weights_dir, lowestval_weight_dir): |
| os.makedirs(lowestval_weight_dir, exist_ok=True) |
| logdir = [] |
| files = [] |
| lbldict = { |
| 'Values': {}, |
| 'Names': {} |
| } |
| weights_dir_path = os.path.join(weights_dir, "") |
| low_val_path = os.path.join(os.getcwd(), os.path.join(lowestval_weight_dir, "")) |
| |
| try: |
| file_dict = LEval(file_dict) |
| except Exception as e: |
| print(f"Error! {e}") |
| return f"Couldn't load tensorboard file! {e}" |
| |
| weights = [f for f in os.scandir(weights_dir)] |
| for key, value in file_dict.items(): |
| pattern = fr"^{model_name}_.*_s{value}\.pth$" |
| matching_weights = [f.name for f in weights if f.is_file() and RSearch(pattern, f.name)] |
| for weight in matching_weights: |
| source_path = weights_dir_path + weight |
| destination_path = os.path.join(lowestval_weight_dir, weight) |
| |
| copy2(source_path, destination_path) |
|
|
| logdir.append(f"File = {weight} Value: {key}, Step: {value}") |
|
|
| lbldict['Names'][weight] = weight |
| lbldict['Values'][weight] = key |
|
|
| files.append(low_val_path + weight) |
|
|
| print(f"File = {weight} Value: {key}, Step: {value}") |
|
|
| yield ('\n'.join(logdir), files, pd.DataFrame(lbldict)) |
| |
|
|
| return ''.join(logdir), files, pd.DataFrame(lbldict) |
| |
|
|
| if __name__ == "__main__": |
| model = str(input("Enter the name of the model: ")) |
| sav_freq = int(input("Enter save frequency of the model: ")) |
| ds = main(model, sav_freq) |
| |
| if ds: selectweights(model, ds, weights_dir, lowestval_weight_dir) |
| |