def fitness_func(solution, sol_idx): global data_inputs, data_outputs, torch_ga, model, loss_function model_weights_dict = torchga.model_weights_as_dict(model=model, weights_vector=solution) model.load_state_dict(model_weights_dict) predictions = model(data_inputs) solution_fitness = 1.0 / ( loss_function(predictions, data_outputs).detach().numpy() + 0.00000001) return solution_fitness
def fitness_func(solution, sol_idx): global data_inputs, data_outputs, torch_ga, model, loss_function model_weights_dict = torchga.model_weights_as_dict(model=model, weights_vector=solution) # Use the current solution as the model parameters. model.load_state_dict(model_weights_dict) predictions = model(data_inputs) abs_error = loss_function(predictions, data_outputs).detach().numpy() + 0.00000001 solution_fitness = 1.0 / abs_error return solution_fitness
fitness_func=fitness_func, parent_selection_type=parent_selection_type, crossover_type=crossover_type, mutation_type=mutation_type, mutation_percent_genes=mutation_percent_genes, keep_parents=keep_parents, on_generation=callback_generation) ga_instance.run() # After the generations complete, some plots are showed that summarize how the outputs/fitness values evolve over generations. ga_instance.plot_result(title="PyGAD & PyTorch - Iteration vs. Fitness", linewidth=4) # Returning the details of the best solution. solution, solution_fitness, solution_idx = ga_instance.best_solution() print("Fitness value of the best solution = {solution_fitness}".format( solution_fitness=solution_fitness)) print("Index of the best solution : {solution_idx}".format( solution_idx=solution_idx)) # Fetch the parameters of the best solution. best_solution_weights = torchga.model_weights_as_dict(model=model, weights_vector=solution) model.load_state_dict(best_solution_weights) predictions = model(data_inputs) print("Predictions : \n", predictions.detach().numpy()) abs_error = loss_function(predictions, data_outputs) print("Absolute Error : ", abs_error.detach().numpy())