使用一批训练数据训练多输入Keras NN

Luc*_*ano 6 keras

我想使用Keras训练多输入NN和一批训练数据,但是我无法传递一组输入和输出样本来执行模型上的拟合train_on_batch.

我的NN定义如下:

    i1 = keras.layers.Input(shape=(2,))
    i2 = keras.layers.Input(shape=(2,))
    i3 = keras.layers.Input(shape=(2,))
    i_layer = keras.layers.Dense(2, activation='sigmoid')
    embedded_i1 = i_layer(i1)
    embedded_i2 = i_layer(i2)
    embedded_i3 = i_layer(i3)

    middle_concatenation = keras.layers.concatenate([embedded_i1, embedded_i2, embedded_i3], axis=1)

    out = keras.layers.Dense(1, activation='sigmoid')(middle_concatenation)

    model = keras.models.Model(inputs=[i1, i2, i3], outputs=out)
    model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

例如,输入的实例(成功用于预测输出)如下:

[array([[0.1, 0.2]]), array([[0.3, 0.5]]), array([[0.1, 0.3]])]

但是当我尝试训练我的模型时:

    inputs = [[np.array([[0.1, 0.2]]), np.array([[0.3, 0.5]]), np.array([[0.1, 0.3]])],
                     [np.array([[0.2, 0.1]]), np.array([[0.5, 0.3]]), np.array([[0.3, 0.1]])]
                         ]
    outputs = np.ones(len(inputs))
    model.fit(inputs, outputs)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ValueError: Error when checking model input: you are passing a list as input to your model, but the model expects a list of 3 Numpy arrays instead. The list you passed was: [[array([[ 0.1,  0.2]]), array([[ 0.3,  0.5]]), array([[ 0.1,  0.3]])], [array([[ 0.2,  0.1]]), array([[ 0.5,  0.3]]), array([[ 0.3,  0.1]])]]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?
如何使用一批输入/输出样本训练多输入NN?

谢谢!

DJK*_*DJK 2

问题只是格式不正确。你不能将列表传递给 keras,只能传递 numpy 数组,所以当你的数据结构如下

 inputs = [[np.array([[0.1, 0.2]]), np.array([[0.3, 0.5]]), np.array([[0.1, 0.3]])],
                     [np.array([[0.2, 0.1]]), np.array([[0.5, 0.3]]), np.array([[0.3, 0.1]])]
                         ]
Run Code Online (Sandbox Code Playgroud)

您需要一次将一个列表元素传递到模型中。您还需要一次将一个输出值传递给模型。为此,outputs请像这样构建您的结构

outputs = [np.ones(1) for x in inputs]

[array([ 1.]), array([ 1.])]
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样循环 fit 函数

 for z in range(0,len(inputs)):
     model.fit(inputs[z],outputs[z],batch_size=1)
Run Code Online (Sandbox Code Playgroud)

您也可以替换model.fitmodel.train_on_batch(),请参阅文档

但是,为了避免循环,您可以只在列表中存储 3 个 numpy 数组inputs,并将其outputs作为 numpy 数组。如果您只想一次训练一个批次,您可以设置批次大小来执行此操作。

inputs = [np.array([[0.1, 0.2],[0.2, 0.1]]), np.array([[0.3, 0.5],[0.5, 0.3]]), np.array([[0.1, 0.3],[0.3, 0.1]])]

outputs = np.ones(inputs[0].shape[0])

model.fit(inputs,outputs,batch_size=1)
Run Code Online (Sandbox Code Playgroud)