Keras:如何用Keras中的输入张量切片常数矩阵?

时间:2018-06-07 13:15:23

标签: python tensorflow keras

代码如下:

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_inputitem_input,然后将切片输入MLP。我应该提前将numpy矩阵转换为张量吗?如何根据输入张量切割矩阵?

提前致谢!

1 个答案:

答案 0 :(得分:0)

是的,您应该在张量中转换矩阵,这可以简单地说:

user_matrix = K.variable(user_matrix)

此外,您还需要K.gathertf.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,),....)来正确实现这一目标。