首页 > 解决方案 > Keras 模型输入顺序

问题描述

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

下面的代码:

#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)

标签: pythonkeraskeras-layer

解决方案


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


推荐阅读