首页 > 解决方案 > 具有多个输入的 Keras 顺序模型

问题描述

我正在制作一个 MLP 模型,它需要两个输入并产生一个输出。

我有两个输入数组(每个输入一个)和 1 个输出数组。神经网络有 1 个隐藏层和 2 个神经元。每个数组有 336 个元素。

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

# Compile the neural network #
model0.compile(
    optimizer = keras.optimizers.RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error',
    metrics=['accuracy']
)

我尝试了两种方法,它们都给出了错误。

model0.fit(numpy.array([array_1, array_2]),output, batch_size=16, epochs=100)

ValueError:检查输入时出错:预期的dense_input具有形状(2,)但得到的数组形状为(336,)

第二种方式:

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)

ValueError:检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 1 个数组,但得到了以下 2 个数组的列表:

类似的问题。但不使用顺序模型。

标签: pythonarraystensorflowkeras

解决方案


要解决此问题,您有两种选择。

1. 使用顺序模型

在馈送到网络之前,您可以将两个数组连接成一个。假设这两个数组的形状为 (Number_data_points, ),现在可以使用numpy.stack方法合并数组。

merged_array = np.stack([array_1, array_2], axis=1)

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

model0.fit(merged_array,output, batch_size=16, epochs=100)

2.使用功能API。

当模型有多个输入时,这是最推荐使用的方法。

input1 = keras.layers.Input(shape=(1, ))
input2 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2])
dense1 = keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True)(merged)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense1)
model10 = keras.models.Model(inputs=[input1, input2], output=output)

现在您可以使用您尝试适合模型的第二种方法

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)


推荐阅读