Python 如何使用Keras构建具有多个输入和单个输出的模型

Python 如何使用Keras构建具有多个输入和单个输出的模型,python,tensorflow,keras,jupyter-lab,functional-api,Python,Tensorflow,Keras,Jupyter Lab,Functional Api,我试图使用Keras的函数api来构建一个具有多个输入和单个输出的模型。 目标是组合每个输入的每一行以预测相应的输出(1或0)。 例如,串联(输入1[0]和输入2[0])和预测输出输出[0] 我的数据结构如下所示: inputs_1 = [[[-18.73, 8.98, 0.29, 0.23],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]], [[-18.73, 8.98, 0.29, 0.65],[5

我试图使用Keras的函数api来构建一个具有多个输入和单个输出的模型。 目标是组合每个输入的每一行以预测相应的输出(1或0)。
例如,
串联(输入1[0]和输入2[0])
和预测输出
输出[0]

我的数据结构如下所示:

inputs_1 = [[[-18.73, 8.98, 0.29, 0.23],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]], 
           [[-18.73, 8.98, 0.29, 0.65],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]],
           [[-18.73, 8.98, 0.29, 9,3],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]],
            ...
            [[-18.73, 8.98, 0.29, 8.93],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]]]
            

inputs_2 = [[[0.29, 0.23], [28.31, -1.62]], 
           [[8.98, 0.65], [21.31, 1.62]],
           [[18.50, -1.62], [25.89, 1.62]],
            ...
            [[-48.73, 8.98], [48.70, 1.62]]]

outputs = [1,
           1, 
           0, 
           ...
           0]
我在构建模型时遇到了一些困难,第一个问题是当我想重塑数据时

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

# scale our data set so that every observation is between 0 and 1
training_data = scaler.fit_transform(inputs_1.reshape(-1, 1))
但是
列表
对象没有属性
重塑

我读过这篇文章,但对我帮助不大。 然而,我现在知道,我将通过连接将所有可用的特性合并到一个大的向量中。如何使用这些嵌套数组执行此操作?
另一个困难是将数据分为训练、验证和测试。我发现它是基于一个单一的输入数据。有没有办法吐出多个数据输入

在这种情况下,如何定义层来构建模型?
如何使用api构建模型?
欢迎提供任何提示或模型框架。

提前谢谢你。

你问的问题很多,通常都不符合你的要求。最好分别处理每个问题(先搜索,如果找不到,再问)

不过,为了帮助您开始,我将尝试按照您要求的顺序回答这些问题。首先,您的代码很少有问题-

  • 在使用
    重塑
    之前,必须先将
    输入_1
    输入_2
    转换为numpy数组。使用
    inputs\u 1=np.array(inputs\u 1)
    并将其用于input\u 2

  • 接下来,您要应用最小-最大缩放器,但要使用
    重塑(-1,1)
    。这是没有意义的,因为每个功能的最小-最大缩放是相互独立的。我已经展示了如何重塑适当的最小-最大缩放

  • 您还询问了列车测试拆分。您可以简单地使用sklearn的
    train\u test\u split
    ,就像您通常对更多输入使用它一样

  • 最后,您询问了多输入Keras函数API。这确实做得很好(事实上,这也是keras作者的哲学,使深度学习易于学习和实施)。我在下面添加了一个示例-

  • 使用最小-最大缩放器缩放 多个输入/输出的列车试验分割 具有2个输入和1个输出的Keras功能API

    多输入模型的训练
    很乐意帮忙。这就解决了你的问题,一定要做正确的标记,因为它鼓励我在将来再次帮助你。
    #Dummy data (USE YOUR OWN DATA HERE AS NUMPY ARRAYS
    import numpy as np
    X1 = np.random.random((1000, 3, 4))
    X2 = np.random.random((1000, 2, 2))
    y = np.random.randint(0, 2, (1000,))
    
    #Scaling individual features by respective min max for 3D tensors
    from sklearn.preprocessing import MinMaxScaler
    
    #Have separate scaler objects for each input data
    scaler1 = MinMaxScaler()
    scaler2 = MinMaxScaler()
    
    #Ensure that in reshape to 2D matrix, you keep the number of features separate
    #as min-max scaler works on each feature's respective min-max values
    #Then, reshape it back to the 3D dataset
    
    X1_scaled = scaler1.fit_transform(X1.reshape(-1,X1.shape[-1])).reshape(X1.shape)
    X2_scaled = scaler1.fit_transform(X2.reshape(-1,X2.shape[-1])).reshape(X2.shape)
    
    print(X1_scaled.shape, X2_scaled.shape)
    
    (1000, 3, 4) (1000, 2, 2)
    
    from sklearn.model_selection import train_test_split
    
    X1_train, X1_test, X2_train, X2_test, y_train, y_test = train_test_split(X1_scaled, X2_scaled, y, test_size=0.2)
    
    [i.shape for i in (X1_train, X1_test, X2_train, X2_test, y_train, y_test)]
    
    [(800, 3, 4), (200, 3, 4), (800, 2, 2), (200, 2, 2), (800,), (200,)]
    
    from tensorflow.keras import layers, Model, utils
    
    inp1 = layers.Input((3,4))
    inp2 = layers.Input((2,2))
    x1 = layers.Flatten()(inp1)
    x2 = layers.Flatten()(inp2)
    x = layers.concatenate([x1, x2])
    x = layers.Dense(32)(x)
    out = layers.Dense(1, activation='sigmoid')(x)
    
    model = Model([inp1, inp2], out)
    
    utils.plot_model(model, show_layer_names=False, show_shapes=True)
    
    model.compile(loss='binary_crossentropy', optimizer='adam')
    model.fit([X1_train, X2_train], y_train, epochs=4)
    
    Epoch 1/4
    25/25 [==============================] - 0s 674us/step - loss: 0.7310
    Epoch 2/4
    25/25 [==============================] - 0s 753us/step - loss: 0.7198
    Epoch 3/4
    25/25 [==============================] - 0s 842us/step - loss: 0.7147
    Epoch 4/4
    25/25 [==============================] - 0s 2ms/step - loss: 0.7079