Керас модель порядок входов - PullRequest
0 голосов
/ 09 ноября 2018

У меня было 3 отдельные модели, которые были в основном в структуре user-item. Я хотел объединить их, а затем запустить несколько слоев postge. Однако когда пришло время для входов, я впервые получил ошибку. Я предполагал, что мне потребуются входные данные в структуре [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)

1 Ответ

0 голосов
/ 09 ноября 2018

Ваш код правильный, как есть. Ваша модель имеет один вход (user_input), а затем внутри модели, которую вы используете Input(), в трех разных слоях.

...