0

テンソルフローを初めて使用し、テンソルフローを使用する推奨システムについて調べています。私はgithubの中にいくつかのサンプルコードを検証し、ほとんど同じfollwingTensorflowを使用したマトリックス分解に基づく推奨

https://github.com/songgc/TF-recomm/blob/master/svd_train_val.py

として次のように出くわすしかし、問題は、どのように私は上記のコードでは、ユーザU1のためのトップの推薦を選ぶんですか?

サンプルコードまたはアプローチがある場合は、教えてください。ありがとう

答えて

0

少し難しいです!基本的には、svdが返ってくるとセッションを閉じ、テンソルはその値を失います(まだグラフを保持しています)。いくつかのオプションがあります:

  1. モデルをファイルに保存して後で復元します。
  2. ブロックをwith tf.Session() as sess: ....ブロックに入れず、代わりにセッションを返します。
  3. with ...ブロック

内の最悪のオプションをユーザーの処理を行いますオプション3:あなたはそれを使用して別にモデルを訓練する必要があります。最良の方法は、モデルとウェイトをどこかに保存してからセッションを復元することです。しかし、このセッションオブジェクトをどのように使用したのかという疑問が残っています。その部分を示すために、セッションを復元する方法を知っていることを前提に、この問題をオプション3を使用して解決します。

def svd(train, test): 
    samples_per_batch = len(train) // BATCH_SIZE 

    iter_train = dataio.ShuffleIterator([train["user"], 
            train["item"], 
            train["rate"]], 
            batch_size=BATCH_SIZE) 

    iter_test = dataio.OneEpochIterator([test["user"], 
            test["item"], 
            test["rate"]], 
            batch_size=-1) 

    user_batch = tf.placeholder(tf.int32, shape=[None], name="id_user") 
    item_batch = tf.placeholder(tf.int32, shape=[None], name="id_item") 
    rate_batch = tf.placeholder(tf.float32, shape=[None]) 

    infer, regularizer = ops.inference_svd(user_batch, item_batch, user_num=USER_NUM, item_num=ITEM_NUM, dim=DIM, 
             device=DEVICE) 
    global_step = tf.contrib.framework.get_or_create_global_step() 
    _, train_op = ops.optimization(infer, regularizer, rate_batch, learning_rate=0.001, reg=0.05, device=DEVICE) 

    init_op = tf.global_variables_initializer() 
    with tf.Session() as sess: 
     sess.run(init_op) 
     summary_writer = tf.summary.FileWriter(logdir="/tmp/svd/log", graph=sess.graph) 
     print("{} {} {} {}".format("epoch", "train_error", "val_error", "elapsed_time")) 
     errors = deque(maxlen=samples_per_batch) 
     start = time.time() 
     for i in range(EPOCH_MAX * samples_per_batch): 
      users, items, rates = next(iter_train) 
      _, pred_batch = sess.run([train_op, infer], feed_dict={user_batch: users, item_batch: items, rate_batch: rates}) 
      pred_batch = clip(pred_batch) 
      errors.append(np.power(pred_batch - rates, 2)) 
      if i % samples_per_batch == 0: 
       train_err = np.sqrt(np.mean(errors)) 
       test_err2 = np.array([]) 
       for users, items, rates in iter_test: 
        pred_batch = sess.run(infer, feed_dict={user_batch: users,item_batch: items}) 
        pred_batch = clip(pred_batch) 
        test_err2 = np.append(test_err2, np.power(pred_batch - rates, 2)) 
       end = time.time() 
       test_err = np.sqrt(np.mean(test_err2)) 
       print("{:3d} {:f} {:f} {:f}(s)".format(i // samples_per_batch, train_err, test_err, end - start)) 
       train_err_summary = make_scalar_summary("training_error", train_err) 
       test_err_summary = make_scalar_summary("test_error", test_err) 
       summary_writer.add_summary(train_err_summary, i) 
       summary_writer.add_summary(test_err_summary, i) 
       start = end 

     # Get the top rated movie for user #1 for every item in the set 
     userNumber = 1 
     user_prediction = sess.run(infer, feed_dict={user_batch: np.array([userNumber]), item_batch: np.array(range(ITEM_NUM))}) 
     # The index number is the same as the item number. Orders from lowest (least recommended) 
     # to largeset 
     index_rating_order = np.argsort(user_prediction) 

     print "Top ten recommended items for user {} are".format(userNumber) 
     print index_rating_order[-10:][::-1] # at the end, reverse the list 

     # If you want to include the score: 
     items_to_choose = index_rating_order[-10:][::-1] 
     for item, score in zip(items_to_choose, user_prediction[items_to_choose]): 
      print "{}: {}".format(item,score) 

私が最初にコメントした行からの変更点は、次のとおりです。もう一度強調するために、この機能を訓練することがベストプラクティスではなく、実際に予測を個別に行うことです。

+0

私はプレディクタを作成する方法を示すGitHubリポジトリを作成しました。 TF-recommに基づいています: https://github.com/kiwidamien/TensorFlowRec –

+0

お返事ありがとうございました。助けになる –

関連する問題