簡體   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