python - 使用 PyGAD 的形状尺寸不兼容
问题描述
我正在尝试按照此处给出的教程进行操作。
本教程使用遗传算法和 PyGAD 包训练 Keras 模型。我对二进制分类案例感兴趣。我的输入矩阵是维度的10000x20
。因此,我使用 Keras 创建了以下模型:
input_layer = tensorflow.keras.layers.Input(20)
dense_layer1 = tensorflow.keras.layers.Dense(500, activation="relu")(input_layer)
dense_layer2 = tensorflow.keras.layers.Dense(500, activation="relu")(dense_layer1)
output_layer = tensorflow.keras.layers.Dense(1, activation="softmax")(dense_layer2)
model = tensorflow.keras.Model(inputs=input_layer, outputs=output_layer)
keras_ga = pygad.kerasga.KerasGA(model=model,
num_solutions=10)
但是,当我使用 运行算法时,ga_instance.run()
出现错误:
ValueError: Shapes (10000,) and (10000, 1) are incompatible
我无法弄清楚为什么会出现此错误?我希望我的 Keras 模型有 2 个隐藏层,每个隐藏层有 500 个隐藏节点和 1 个输出节点。
解决方案
我认为问题与每个输出在数组中的表示方式有关。如果您有 10000 个实例的单个输出,那么这是准备与 PyGAD 一起使用的数据的示例。它的形状是(1000, 1)
。
numpy.random.uniform(0, 1, (1000, 1))
这是一个适用于简单网络架构的代码,因为根据您使用的适应度函数,适应度有时是NaN
.
由于我没有您使用的相同数据,因此我随机生成了输入/输出数据。
import tensorflow.keras
import pygad.kerasga
import numpy
import pygad
def fitness_func(solution, sol_idx):
global data_inputs, data_outputs, keras_ga, model
model_weights_matrix = pygad.kerasga.model_weights_as_matrix(model=model,
weights_vector=solution)
model.set_weights(weights=model_weights_matrix)
predictions = model.predict(data_inputs)
cce = tensorflow.keras.losses.CategoricalCrossentropy()
solution_fitness = 1.0 / (cce(data_outputs, predictions).numpy() + 0.00000001)
# print("solution_fitness", cce(data_outputs, predictions).numpy(), solution_fitness)
return solution_fitness
def callback_generation(ga_instance):
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution(ga_instance.last_generation_fitness)[1]))
data_inputs = numpy.random.uniform(0, 1, (1000, 20))
data_outputs = numpy.random.uniform(0, 1, (1000, 1))
# create model
from tensorflow.keras.layers import Dense, Dropout
l1_rate=1e-6
l2_rate = 1e-6
input_layer = tensorflow.keras.layers.InputLayer(20)
dense_layer1 = tensorflow.keras.layers.Dense(10, activation="relu",kernel_regularizer=tensorflow.keras.regularizers.l1_l2(l1=l1_rate, l2=l2_rate))
output_layer = tensorflow.keras.layers.Dense(1, activation="sigmoid")
model = tensorflow.keras.Sequential()
model.add(input_layer)
model.add(dense_layer1)
model.add(Dropout(0.2))
model.add(output_layer)
keras_ga = pygad.kerasga.KerasGA(model=model,
num_solutions=10)
# Run pygad
num_generations = 30
num_parents_mating = 5
initial_population = keras_ga.population_weights
ga_instance = pygad.GA(num_generations=num_generations,
num_parents_mating=num_parents_mating,
initial_population=initial_population,
fitness_func=fitness_func,
on_generation=callback_generation)
ga_instance.run()
感谢您使用PyGAD!
推荐阅读
- arrays - 使用 Typescript 从数组中的键返回最大的数字
- c# - 您如何根据在此问题中所做的按键字母选择列表框中的项目,但在 UWP 中?
- python - 将多个文件的内容存储在数组 Python 中
- asp.net-core - 在 ASP.net Core 2.1 MVC 的开发机器上更改主机名不起作用(在 MVC 5 上很好)
- angular - http.post - 获取响应数据
- java - 我是否使用 Tomcat 网络服务器?
- sqlite - sqlite-net-extensions -- 创建表异步
- python - 在 Python 中从同一文件夹加载多个数据文件
- java - SQS SendMessage 异常/一次性延迟
- c# - 如何生成不易受 SQL 注入攻击的字符串