首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >高效地计算两个矩阵的所有组合(行向),作为TensorFlow中经过预处理的二进制分类器的输入?

高效地计算两个矩阵的所有组合(行向),作为TensorFlow中经过预处理的二进制分类器的输入?
EN

Stack Overflow用户
提问于 2017-08-06 14:10:09
回答 1查看 165关注 0票数 0

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

我有100,000个用户,每个用户由3‘283个特性表示,因此用户矩阵的维度为100000x3283。大约有170万个项目,它们所代表的特征数量(3277)也几乎相同。这些特征被进一步划分为连续的和明确的parst。因此,模型中有4个占位符,它们期望在括号中包含特征量的值:

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

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

,什么是最有效的方法?

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

代码语言:javascript
代码运行次数:0
运行
复制
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特斯拉K80上运行实验,总GPU约为23 be,但已经注意到,使用tf.float32的变量表示是应该的3-4倍,因此需要分块的项目,例如200 K,或300 K。

,谢谢您的任何有益建议!

EN

回答 1

Stack Overflow用户

发布于 2017-08-23 05:06:42

我不知道这是否是最有效的方法,但是我会按照下面的方法来处理这个问题。使您的模型将n用户和m项目配置文件作为输入并输出为输出的n x m矩阵--输入中的每个用户/项对对应一个。一旦您有了这个模型,您就可以试验nm的值,这些值在您的硬件上运行得很好。然后,只需使用正确的用户/项块调用该模型,并在每次模型调用之后更新每个用户当前的最佳项。

维护应该是可管理的,并且很可能可以在CPU上完成。为100 k用户提供1000项-> 4*1000*100 k=400 for矩阵。如果您为每个用户排序的项目评分,更新可以相当便宜。而且,您一次只与n用户打交道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45532840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档