用于训练多输入函数式Keras模型的几个X输入的格式

0 人关注

所以我目前正试图了解多输入的keras模型所期望的格式,不明白如何输入几个。

from tensorflow.keras.models import Model
import tensorflow.keras
import tensorflow as tf
first_input = Input(2)
second_input = Input(2)
concat_layer= Concatenate()([first_input, second_input ])
hidden= Dense(2, activation="relu")(concat_layer)
output = Dense(1, activation="sigmoid")(hidden)
model = Model(inputs=[first_input, second_input], outputs=output)
model.summary()
model.compile(loss='mean_squared_error', metrics=['mean_squared_error'], optimizer='adam')
# I managed to get the format for prediction and single training data correct
# this works
inp = [np.array([[0,2]]), np.array([[0,2]])]
model.predict(inp)
model.fit(inp,np.array([42]), epochs=3, )
# I don´t get why this isn´t working
# this doesn´t work
model.fit(np.array([inp,inp]),np.array([42, 43]), epochs=3, )´

在阅读了fit函数的keras文档后,我真的不明白为什么我的版本不能工作。

x : 训练数据的向量、矩阵或数组(如果模型有多个输入,则为列表)。如果模型中的所有输入都是命名的,你也可以传递一个将输入名称映射到数据的列表。如果从框架原生的张量(例如TensorFlow数据张量)中输入,x可以是NULL(默认)。

因为我简直是在给它一个列表的阵列。

最后一行代码导致以下错误。

ValueError: Layer model expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 2, 1, 2) dtype=int64>]

希望得到任何帮助。

python
numpy
tensorflow
keras
dataformat
SegmentationFaultLover
SegmentationFaultLover
发布于 2021-05-22
1 个回答
Pedro Marques
Pedro Marques
发布于 2021-05-22
已采纳
0 人赞同

当你创建模型时

model = Model(inputs=[first_input, second_input], outputs=output)

这意味着输入预计是一个由2个形状为(2,)的张量和一个形状为(1,)的输出组成的列表(由最后一个密集层定义)。

所以,当你使用作为参数。

inp = [np.array([[0,2]]), np.array([[0,2]])]

这是一个有2个形状为(1,2)的数组的列表

np.array([42])

它是一个形状为(1)的数组

这符合你的模型定义。[实际上,输出应该有一个(1,1)的形状] 。

The line

model.fit(np.array([inp,inp]),np.array([42, 43]))

是想给一个整体形状为[2, 2, 1, 2]的数组列表和一个形状为[2]的目标。这与模型的定义不一致。

由于这很容易出错,我倾向于先建立.fit或预测调用的参数,然后明确打印它们的形状。

x_train = [a, b] # where a and b are np.arrays
print([x.shape for x in x_train])

例如,请尝试。

x_first = np.random.rand(8, 2) # batch_size 8, feature_size 2
x_second = np.random.rand(8, 2)
x_train = [a, b]