繁体   English   中英

有效地计算两个矩阵的所有组合(行)作为TensorFlow中预训练的二进制分类器的输入?

[英]Efficiently compute all combinations (row-wise) of two matrices as input for a pretrained binary classifier in TensorFlow?

我正在对TensorFlow中推荐系统领域的研究进行评估。 我已经预训练了一个二进制分类器,该分类器输出[0,1]内的值。 它需要一个用户和一个项目表示形式,它们需要进一步转换为模型中的嵌入。

我有100´000个用户,每个用户都由3´283个特征表示,因此用户矩阵的尺寸为100000x3283。 有约170万个项目也代表了几乎相同数量的特征(3277)。 这些特征进一步分为连续和分类Parst。 因此,模型中有4个占位符,期望使用括号中的特征量表示值:

  • 用户连续(12)
  • 用户分类(3271)
  • 连续项(6)
  • 类别项目(3271)

我需要为每个> 10 ^ 11组合计算各自的值,并为每个用户rgd收集最佳1000个项目的索引和输出值。 最高的网络输出。

最有效的方法是什么?

遇到tf.nn.top_k函数时,我仍然不确定是否将数据部分(部分)预加载到Tensor变量中(由于TF进行内部复制,常量使用了太多的内存),或者通过numpy数组进行读取,以及如何做里面的组合。 我在会话运行过程中使用了循环和np.repeat,但是这太占用内存,而且时间效率太低。 因此,以下代码是第一次尝试-知道它的效率很低,但至少可以使它起作用:

sess = tf.Session()
saver.restore(sess, tf.train.latest_checkpoint('logging_embed/'))
results = np.zeros(len(items))
start = time.time()
results = sess.run(out_layer, feed_dict={user_cont: np.repeat(np.atleast_2d(profiles[user, :12]), len(items), axis=0),
                                         user_cat: np.repeat(np.atleast_2d(profiles[user, 12:]), len(items), axis=0),
                                         item_cont: np.atleast_2d(items[:, :6]),
                                         item_cat: np.atleast_2d(items[:, 6:])})
print(str(time.time() - start))

我正在2个Tesla GPU K80上进行实验,总GPU-RAM约为23GB,但已经注意到使用tf.float32的Variable表示形式是其应有的3-4倍,因此需要对项目进行分块,例如200k或300k。

在此先感谢您提供任何有用的建议!

我不知道这是否是最有效的方法,但是我将按照以下方式解决该问题。 使您的模型将n用户和m项目配置文件作为输入,并输出nxm个输出矩阵-输入中的每个用户/项对一个。 一旦有了该模型,就可以尝试在硬件上正常工作的nm值。 然后,只需使用正确的用户/项目块调用此模型,并在每次模型调用后为每个用户更新当前的最佳项目。

维护应该是可管理的,并且可能可以在CPU上完成。 10万个用户1000个项目-> 4 * 1000 * 100k = 400MB矩阵。 如果您保持每个用户的项目得分排序,则更新可能会非常便宜。 另外,您一次只能处理n用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM