Keras 模型输入顺序

Keras model order of inputs

我有 3 个独立的模型,基本上都是用户项结构。我想合并这些然后 运行 几层 post merege。然而,当需要输入时,我首先遇到了一个错误。我曾假设我需要 [item1, user, item2, users, item3 users] 结构中的输入,它与我的 3 个初始独立模型的输入相匹配。然而,在这样做时,它基本上是说,“你不能重复输入”。然而,我觉得 [item1, item2, item3, user] 结构有些问题,尽管它 运行 的结果不错。我是否应该简单地复制用户以创建相同的用户 1、用户 2、用户 3?

代码如下:

#Making the vctors for the primary categories
item1_input = Input(shape=[1])
item2_input = Input(shape=[1])
item3_input = Input(shape=[1])
user_input = Input(shape=[1])

item1_vec = Flatten()(Embedding(nb_item1s + 1, 32)(item1_input))
item1_vec = Dropout(0.5)(item1_vec)


item2_vec = Flatten()(Embedding(nb_breweries + 1, 32)(item2_input))
item2_vec = Dropout(0.5)(item2_vec)


item3_vec = Flatten()(Embedding(nb_item3s + 1, 32)(item3_input))
item3_vec = Dropout(0.5)(item3_vec)

user_vec = Flatten()(Embedding(nb_users + 1, 32)(user_input))
user_vec = Dropout(0.5)(user_vec)

# Next, we join them all together and put them
# through a pretty standard deep learning architecture
item1_input_vecs = add([item1_vec, user_vec])
item1_nn = Dropout(0.5)(Dense(128, activation='relu')(item1_input_vecs))
item1_nn = BatchNormalization()(item1_nn)
item1_nn = Dropout(0.5)(Dense(128, activation='relu')(item1_nn))
#item1_nn = BatchNormalization()(item1_nn)
#item1_nn = Dense(128, activation='relu')(item1_nn)
item1_result = Dense(9, activation='softmax')(item1_nn)

item2_input_vecs = add([item2_vec, user_vec])
item2_nn = Dropout(0.5)(Dense(128, activation='relu')(item2_input_vecs))
item2_nn = BatchNormalization()(item2_nn)
item2_nn = Dropout(0.5)(Dense(128, activation='relu')(item2_nn))
#item2_nn = BatchNormalization()(item2_nn)
#item2_nn = Dense(128, activation='relu')(item2_nn)
item2_result = Dense(9, activation='softmax')(item2_nn)

item3_input_vecs = add([item3_vec, user_vec])
item3_nn = Dropout(0.5)(Dense(128, activation='relu')(item3_input_vecs))
item3_nn = BatchNormalization()(item3_nn)
item3_nn = Dropout(0.5)(Dense(128, activation='relu')(item3_nn))
#item3_nn = BatchNormalization()(item3_nn)
#item3_nn = Dense(128, activation='relu')(item3_nn)
item3_result = Dense(9, activation='softmax')(item3_nn)

result_vecs = Concatenate()([item1_result, item2_result, item3_result])
result_vecs = Dropout(0.5)(result_vecs)

final_nn = Dense(128,activation='relu')(result_vecs)
final_nn = Dropout(0.5)(final_nn)
final_result = Dense(9, activation='softmax')(final_nn)

finalmodel = Model(inputs=[item1_input, item2_input, item3_input, user_input], outputs=final_result)
finalmodel.compile(optimizer='adam', loss = 'categorical_crossentropy')


finalhistory = finalmodel.fit([a_item1id, a_item2id, a_item3id, a_userid], a_y, 
                     epochs=20, 
                     validation_data=([b_item1id, b_item2id, b_item3id, b_userid], b_y), verbose=1)

您的代码是正确的。您的模型有一个输入 (user_input),然后在模型内部您在三个不同的层中使用此 Input()