具有多个输入的 Keras 序列模型

gho*_* 88 17 python arrays keras tensorflow

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

I have two input arrays (one for each input) and 1 output array. The neural network has 1 hidden layer with 2 neurons. Each array has 336 elements.

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']
)
Run Code Online (Sandbox Code Playgroud)

I tried two ways, both of them are giving errors.

model0.fit(numpy.array([array_1, array_2]),output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)

ValueError: Error when checking input: expected dense_input to have shape (2,) but got array with shape (336,)

The second way:

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 2 arrays:

Similar question. But not using sequential model.

Mit*_*iku 26

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

1. 使用顺序模型

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

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

Run Code Online (Sandbox Code Playgroud)
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)

Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)

  • 你不能总是连接。尺寸可能不对齐。 (3认同)

Piy*_*ngh 7

与您链接的答案一样,您不能Sequential出于上述原因使用API。您应该使用ModelAPI,也称为功能 API。在架构上,您需要为模型定义如何将输入与 Dense 层相结合,即您希望如何创建中间层,即。合并/添加或减去等/构建嵌入层等),或者您可能想要 2 个神经网络,每个输入 1 个,并且只想在最后一层合并输出。上述每个的代码都会有所不同。

这是一个可行的解决方案,假设您要将输入合并为形状为 672 的向量,然后在该输入上构建神经网络:

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam, RMSprop
import numpy as np

input1 = Input(shape=(336,))
input2 = Input(shape=(336,))
input = Concatenate()([input1, input2])
x = Dense(2)(input)
x = Dense(1)(x)
model = Model(inputs=[input1, input2], outputs=x)
model.summary()
Run Code Online (Sandbox Code Playgroud)

你会注意到这个模型合并或连接了两个输入,然后在其上构建了一个神经网络:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 672)          0           input_1[0][0]                    
                                                                 input_2[0][0]                    
__________________________________________________________________________________________________
dense (Dense)                   (None, 2)            1346        concatenate[0][0]                
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 1)            3           dense[0][0]                      
==================================================================================================
Total params: 1,349
Trainable params: 1,349
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)

如果您有其他首选方法来创建中间层,则应Concatenate使用代码中的行替换该行。

然后,您可以编译并拟合模型:

model.compile(
    optimizer = RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error'
)


x1, x2 = np.random.randn(100, 336),np.random.randn(100, 336,)
y = np.random.randn(100, 1)
model.fit([x1, x2], y)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供完整的运行示例。 (2认同)