def change_model(config: Configuration, start_time_string): search_dir = config.models_folder loss_to_dir = {} for subdir, dirs, files in os.walk(search_dir): for directory in dirs: # Only "temporary models" are created by the optimizer, other shouldn't be considered if not directory.startswith('temp_snn_model'): continue # The model must have been created after the training has began, older ones are from other training runs date_string_model = '_'.join(directory.split('_')[3:5]) date_model = datetime.strptime(date_string_model, "%m-%d_%H-%M-%S") date_start = datetime.strptime(start_time_string, "%m-%d_%H-%M-%S") if date_start > date_model: continue # Read the loss for the current model from the loss.txt file and add to dictionary path_loss_file = os.path.join(search_dir, directory, 'loss.txt') if os.path.isfile(path_loss_file): with open(path_loss_file) as f: try: loss = float(f.readline()) except ValueError: print('Could not read loss from loss.txt for', directory) continue if loss not in loss_to_dir.keys(): loss_to_dir[loss] = directory else: print('Could not read loss from loss.txt for', directory) # Select the best loss and change the config to the corresponding model min_loss = min(list(loss_to_dir.keys())) config.filename_model_to_use = loss_to_dir.get(min_loss) config.directory_model_to_use = config.models_folder + config.filename_model_to_use + '/' print('Model selected for inference:') print(config.directory_model_to_use, '\n')
def change_model(config: Configuration, start_time_string, num_of_selction_iteration = None, get_model_by_loss_value = None): search_dir = config.models_folder loss_to_dir = {} for subdir, dirs, files in os.walk(search_dir): for directory in dirs: # Only "temporary models" are created by the optimizer, other shouldn't be considered if not directory.startswith('temp_snn_model'): continue # The model must have been created after the training has began, older ones are from other training runs date_string_model = '_'.join(directory.split('_')[3:5]) date_model = datetime.strptime(date_string_model, "%m-%d_%H-%M-%S") date_start = datetime.strptime(start_time_string, "%m-%d_%H-%M-%S") if date_start > date_model: continue # Read the loss for the current model from the loss.txt file and add to dictionary path_loss_file = os.path.join(search_dir, directory, 'loss.txt') if os.path.isfile(path_loss_file): with open(path_loss_file) as f: try: loss = float(f.readline()) except ValueError: print('Could not read loss from loss.txt for', directory) continue if loss not in loss_to_dir.keys(): loss_to_dir[loss] = directory else: print('Could not read loss from loss.txt for', directory) if num_of_selction_iteration == None and get_model_by_loss_value == None: # Select the best loss and change the config to the corresponding model min_loss = min(list(loss_to_dir.keys())) config.filename_model_to_use = loss_to_dir.get(min_loss) config.directory_model_to_use = config.models_folder + config.filename_model_to_use + '/' print('Model selected for inference:') print(config.directory_model_to_use, '\n') elif num_of_selction_iteration is not None and get_model_by_loss_value == None: # Select k-th (num_of_selction_iteration) best loss and change the config to the corresponding model loss_list = (list(loss_to_dir.keys())) loss_list.sort() min_loss = min(list(loss_to_dir.keys())) selected_loss = loss_list[num_of_selction_iteration] config.filename_model_to_use = loss_to_dir.get(selected_loss) config.directory_model_to_use = config.models_folder + config.filename_model_to_use + '/' print("Selection: ", num_of_selction_iteration, ' for model with loss: ', selected_loss, "(min loss:", min_loss,")", 'selected for evaluation on the validation set:') print(config.directory_model_to_use, '\n') return selected_loss elif get_model_by_loss_value is not None: # Select a model by a given loss value (as key) and change the config to the corresponding model config.filename_model_to_use = loss_to_dir.get(get_model_by_loss_value) config.directory_model_to_use = config.models_folder + config.filename_model_to_use + '/' print('Model selected for inference by a given key (loss):') print(config.directory_model_to_use, '\n')