tensorflow:从数据

时间:2018-02-01 09:02:43

标签: python tensorflow

好的,所以我可能完全走错了路。我想要做的是在tensorflow中实现Bayesian Personalized Ranking

如果您不熟悉BPR,实际的培训程序依赖于在线更新,有点像SGD。

我遇到的问题如下。我需要定义自己的损失函数,如下:

def objective(data, lam, item_biases, latent_items, latent_users):  

    user, rated_item, unrated_item = data

    rated_item_bias = item_biases[rated_item]
    unrated_item_bias = item_biases[unrated_item]

    rated_latent_item = latent_items[rated_item]
    unrated_latent_item = latent_items[unrated_item]

    latent_user = latent_users[user]

    rated_pred = rated_item_bias + tf.dot(rated_latent_item, latent_user)
    unrated_pred = unrated_item_bias + tf.dot(unrated_latent_item, latent_user)

    difference = rated_pred - unrated_pred
    obj = tf.sigmoid(difference)

    obj += lam * tf.reduce_sum(rated_item_bias**2)
    obj += lam * tf.reduce_sum(unrated_item_bias**2) 
    obj += lam * tf.reduce_sum(rated_latent_item**2) 
    obj += lam * tf.reduce_sum(unrated_latent_item**2)
    obj += lam * tf.reduce_sum(latent_user**2)

    return obj

请注意,此代码可能有错误的tf类型等,但这不是我关注的问题。如您所见,我有一些可训练的参数(即item_biaseslatent_itemslatent_users)是张量流变量。我有一些lam超参数。我有我的数据。数据本身不是传统数据。相反,它们是索引(对应于[user, seen item, unseen item]三元组),我需要从参数中解压缩这些索引。

所以我的完整数据集可能是这样的:

1  50 6
11 23 24
4  24 5
...

,每行可能是一段数据。不幸的是,我不确定如何在tf框架中“输入”这样的数据。我最初的想法是让data成为tf.placeholder变量,因为我会在训练时将各种值加入其中。但是,当然,如果data是Tensor,我不能只是将它解压缩,就像它是某种元组一样。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

通常超级参数不作为张量输入,因为您在模型之外修改它们并且它们在训练期间是恒定的。这也意味着它们会在您可能执行的任何模型导出中被写为常量,以防止您在参数和模型不匹配时发生的事故。我通常将它们作为标志传递给模型。

另一种常见模式是将输入数据作为张量字典(通常是占位符)。这允许您为不同的输入设置不同的形状。

如果需要,您还可以对张量进行切片。例如,data[:, 3]将使用数据批次中每个条目的第三个值创建张量。