代码如下:
from keras.layers import Embedding, Input, Dense, Flatten, concatenate, Dot, Lambda
from keras import backend as K
def get_model(train, num_users, num_items, userlayers=[512, 64], itemlayers=[1024, 64]):
num_layer = len(userlayers) # Number of layers in the MLP
# Input variables
user_input = Input(shape=(1,), dtype='int32', name='user_input')
item_input = Input(shape=(1,), dtype='int32', name='item_input')
user_matrix = getTrainMatrix(train)
user_latent_vector = K.variable(value=user_matrix[user_input, :])
item_latent_vector = K.variable(value=user_matirx[:, item_input])
userlayer = Dense(userlayers[0], activation="linear", name='userlayer0')
itemlayer = Dense(itemlayers[0], activation="linear", name='itemlayer0')
user_latent_vector = userlayer(user_latent_vector)
item_latent_vector = itemlayer(item_latent_vector)
prediction = Dot(1)([user_latent_vector, item_latent_vector])
model_ = Model(inputs=[user_input, item_input], outputs=prediction)
return model_
getTrainMatrix()
函数返回一个numpy矩阵,其中的行表示用户,列表示项目。该矩阵应该是一个与Input
张量无关的常数矩阵。我希望根据Input
张量(小批量)获得一些行或列,即user_input
和item_input
,然后将切片输入MLP。我应该提前将numpy矩阵转换为张量吗?如何根据输入张量切割矩阵?
提前致谢!
答案 0 :(得分:0)
是的,您应该在张量中转换矩阵,这可以简单地说:
user_matrix = K.variable(user_matrix)
此外,您还需要K.gather
或tf.gather
。张量流版本更好,因为您可以选择轴:
user_latent_vector = Lambda(lambda x: K.gather(user_matrix,x))(user_input)
item_latent_vector = Lambda(lambda x: tf.gather(user_matrix,x,axis=1))(item_input)
也许您需要Input(batch_shape=(None,),....)
来正确实现这一目标。