首页 > 解决方案 > 使用 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 个输出节点。

标签: pythontensorflowkerasdeep-learning

解决方案


我认为问题与每个输出在数组中的表示方式有关。如果您有 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


推荐阅读