我想使用Keras训练多输入NN和一批训练数据,但我无法传递一组输入和输出样本来执行 fit 或模型上的 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'])
例如,输入的一个实例(成功用于预测输出)如下:
[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)
我收到此错误:
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]])]]
我做错了什么? 如何使用一批输入/输出样本训练多输入NN?
谢谢!
答案 0 :(得分: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]])]
]
您需要一次将一个列表元素传递到模型中。您还需要一次将一个输出值传递给模型。为此,请按此结构outputs
outputs = [np.ones(1) for x in inputs]
[array([ 1.]), array([ 1.])]
然后你可以像这样循环遍历fit函数
for z in range(0,len(inputs)):
model.fit(inputs[z],outputs[z],batch_size=1)
您也可以将model.fit
替换为model.train_on_batch()
,请参阅docs
但是为了避免循环,您可以在inputs
列表中存储3个numpy数组,并将单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)
答案 1 :(得分:2)
现在的问题是你现在使用列表列表作为输入,尽管keras需要一个数组列表。
你需要转换你的列表,使其看起来像[array_inputs_1, array_inputs_2, array_inputs_3]
,其中每个输入数组是你传递模型的输入数组(如果它只有那个输入层),你只需将它们中的3个放入一个列表。
使用您的数据正确的输入应为:
[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.1, 0.3]])]
这样,只要所有3个输入数组具有相同数量的元素,keras就会知道如何将tham分成批次。