如何查询pyGAD GA实例的最佳解决方案?

我使用pyGAD Python库提供的遗传算法实现训练了一组神经网络。我编写的代码如下所示:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport pygad.gannimport timeimport pickleret = -1n_sect = 174population_size = 500num_parents_mating = 4 num_generations = 1000mutation_percent = 5parent_selection_type = "rank"crossover_type = "two_points"mutation_type = "random"keep_parents = 1init_range_low = -2init_range_high = 5n_div = 15data = pd.read_csv("delta_results/sub_delta_{}.csv".format(n_sect), index_col=0)data.index = pd.to_datetime(data.index)data = list(data["Delta"])function_inputs = np.array([data[i:i+n_div][:ret] for i in range(0, len(data), n_div)])required_outputs = np.array([[data[i:i+n_div][ret]] for i in range(0, len(data), n_div)])input_layer_size = function_inputs.shape[1]n_hidden_layers = 2hidden_layer_1_size = input_layer_size - 2hidden_layer_2_size = input_layer_size - 4output_layer_size = 1population = pygad.gann.GANN(    num_solutions=population_size,     num_neurons_input=input_layer_size,     num_neurons_output=output_layer_size,     num_neurons_hidden_layers=[hidden_layer_1_size, hidden_layer_2_size], # 2 Hidden Layers    hidden_activations=["relu", "relu"],    output_activation="None")population_vectors = pygad.gann.population_as_vectors(population_networks=population.population_networks)initial_population = population_vectors.copy()def normalize(x):    return x/np.linalg.norm(x, ord=2, axis=0, keepdims=True)def fitness(solution, solution_index):    prediction = pygad.nn.predict(last_layer=population.population_networks[solution_index], data_inputs=function_inputs, problem_type="regression")    prediction = np.array(prediction)    error = (prediction+0.0001)-required_outputs    fitness = np.nan_to_num((np.abs(error)**(-2))).astype(np.float64)    solution_fitness = np.sum(normalize(fitness))    return solution_fitnessdef on_generation(population_instance):    global population    population_matrices = pygad.gann.population_as_matrices(population_networks=population.population_networks, population_vectors=population_instance.population)    population.update_population_trained_weights(population_trained_weights=population_matrices)population_instance = pygad.GA(    num_generations=num_generations,    num_parents_mating=num_parents_mating,    initial_population=initial_population,    fitness_func=fitness,    mutation_percent_genes=mutation_percent,    init_range_low=init_range_low,    init_range_high=init_range_high,    parent_selection_type=parent_selection_type,    crossover_type=crossover_type,    mutation_type=mutation_type,    keep_parents=keep_parents,    on_generation=on_generation)saved_population = pygad.load(filename=".../population_data_v2")best_solution = saved_population.best_solution()print("Population Best Solution Info:\n| Attributes:\n{}\n| Fitness: {}\n| Solution Index: {}".format(best_solution[0], best_solution[1], best_solution[2]))saved_population.plot_result()

运行遗传算法后,我将种群数据保存到一个名为population_data_v2.pkl的文件中(上述代码未显示) – 文件成功创建并保存。

然而,一旦我打开文件,我不知道如何从种群中找到最佳神经网络的信息。

我得到的是一个nd.numpy.array类型的解决方案(best_solution[0]),我不知道如何查询它,或者如何传入函数输入并查看最佳解决方案的预测结果。

任何帮助将不胜感激!


回答:

感谢使用PyGAD

我看到您正确构建了示例。您可以使用以下三个简单步骤轻松使用最佳解决方案进行预测。

请注意,每一代之后,population属性都会更新为最新的种群。这意味着当PyGAD完成所有代数后,最后的种群将保存在population属性中。

步骤1

在您使用pygad.load()函数加载保存的模型后,就像您在适应度函数中所做的那样,您可以使用population属性恢复网络的权重,如下所示:

population_matrices = pygad.gann.population_as_matrices(population_networks=population.population_networks, population_vectors=saved_population.population)population.update_population_trained_weights(population_trained_weights=population_matrices)

步骤2

best_solution()方法返回三个输出,其中第三个表示最佳解决方案的索引。您可以使用它进行预测,如下所示:

best_solution = saved_population.best_solution()prediction = pygad.nn.predict(last_layer=population.population_networks[best_solution[2]], data_inputs=function_inputs, problem_type="regression")

步骤3

最后,您可以打印预测值:

prediction = np.array(prediction)print("Prediction of the best solution: {pred}".format(pred=prediction))

完整代码

根据上述讨论,以下是基于最佳解决方案进行预测的完整代码:

population_matrices = pygad.gann.population_as_matrices(population_networks=population.population_networks, population_vectors=saved_population.population)population.update_population_trained_weights(population_trained_weights=population_matrices)best_solution = saved_population.best_solution()prediction = pygad.nn.predict(last_layer=population.population_networks[best_solution[2]], data_inputs=function_inputs, problem_type="regression")prediction = np.array(prediction)print("Prediction of the best solution: {pred}".format(pred=prediction))

如果有任何问题,请告诉我。

再次感谢您使用PyGAD

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注