我正在对我在TensorFlow推荐系统领域的研究进行评估。我预先训练了一个二进制分类器,它在0,1内输出一个值,它需要一个用户和一个项表示,并将其进一步转换为模型中的嵌入。
我有100,000个用户,每个用户由3‘283个特性表示,因此用户矩阵的维度为100000x3283。大约有170万个项目,它们所代表的特征数量(3277)也几乎相同。这些特征被进一步划分为连续的和明确的parst。因此,模型中有4个占位符,它们期望在括号中包含特征量的值:
我需要为>10^11组合中的每一个计算各自的值,并为每个用户rgd收集最佳1000项的索引和输出值。最高的网络输出。
,什么是最有效的方法?
在遇到tf.nn.top_k函数时,我仍然不确定是否将数据(部分)预加载到张量变量(因为常量由于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特斯拉K80上运行实验,总GPU约为23 be,但已经注意到,使用tf.float32的变量表示是应该的3-4倍,因此需要分块的项目,例如200 K,或300 K。
,谢谢您的任何有益建议!
发布于 2017-08-22 21:06:42
我不知道这是否是最有效的方法,但是我会按照下面的方法来处理这个问题。使您的模型将n
用户和m
项目配置文件作为输入并输出为输出的n x m
矩阵--输入中的每个用户/项对对应一个。一旦您有了这个模型,您就可以试验n
和m
的值,这些值在您的硬件上运行得很好。然后,只需使用正确的用户/项块调用该模型,并在每次模型调用之后更新每个用户当前的最佳项。
维护应该是可管理的,并且很可能可以在CPU上完成。为100 k用户提供1000项-> 4*1000*100 k=400 for矩阵。如果您为每个用户排序的项目评分,更新可以相当便宜。而且,您一次只与n
用户打交道。
https://stackoverflow.com/questions/45532840
复制相似问题