首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FactorizedTopK在TensorFlow推荐程序中的应用

FactorizedTopK在TensorFlow推荐程序中的应用
EN

Stack Overflow用户
提问于 2021-03-22 16:38:16
回答 1查看 1.1K关注 0票数 2

我查看了所有的快速入门教程,并使用检索示例将其调整为我的数据集。views_df包含对user_idscontent_ids,并在用户查看内容时表示。

数据集和结果

该数据集相当小(来自63个用户的1026次浏览187个内容),但代码似乎有效,我的结果如下:

火车:

分解_top_k/top_1_范畴_精度: 0.0012分解_top_k/top_5_范畴_精度: 0.0816因式分解_top_k/top_10_范畴_精度: 0.2046因式分解_top_k/top_50_范畴_精度: 0.7430 factorized_top_k/top_100_categorical_accuracy: 0.8965损失: 494.7287

测试:

分解_top_k/top_1_范畴_精度: 0.0分解_top_k/top_5_范畴_精度: 0.0243因式分解_top_k/top_10_范畴_精度: 0.0585因式分解_top_k/top_50_范畴_精度: 0.3804 factorized_top_k/top_100_categorical_accuracy: 0.6146损失: 31.29269790649414,

问题

我不确定我是否从dataset中正确地创建了查询嵌入和候选嵌入,用于计算度量FactorizedTopK度量。在一般情况下,我也很难计算出theFactorizedTopK度量。我看了一下源代码,但不明白它是如何计算的。

主要参数是对查询和候选嵌入: query_embeddings的第一行表示用户从第一行候选嵌入中选择的候选查询。该任务将尝试最大化这些查询(候选对)的亲和力,同时最小化查询与属于批处理中其他查询的候选人之间的亲缘关系。

真相从何而来?查询和候选嵌入不只是所有用户和内容的列表吗?重要程度的顺序是多少?有人能用更简单的术语解释FactorizedTopK度量的计算吗?

提前感谢

代码

代码语言:javascript
运行
复制
import os
import pprint
import tempfile
from typing import Dict, Text
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_recommenders as tfrs
import pandas as pd
import matplotlib.pyplot as plt

# Variables
seed = 42
test_percentage = 20
train_percentage = 100-test_percentage
embedding_dimension = 32 # 64 ?
metrics_batchsize = 16
train_batchsize = 128
test_batchsize = 64
learning_rate = 0.1 # 0.5 ?
epochs = 3
index_batchsize = 100

views_df = pd.read_csv('filepath')

views_df = views_df[['user_id','content_id']]
users_df = views_df['user_id'].unique()
contents_df = views_df['content_id'].unique()

views_ds = tf.data.Dataset.from_tensor_slices(dict(views_df))
contents_ds = tf.data.Dataset.from_tensor_slices(contents_df)

view_size = len(views_df)
train_size = round(view_size/100*train_percentage)
test_size = view_size-train_size

tf.random.set_seed(seed)

views_ds_shuffled = views_ds.shuffle(len(views_df), seed=seed, reshuffle_each_iteration=False)

train = views_ds_shuffled.take(train_size)
test = views_ds_shuffled.skip(train_size).take(test_size)

user_model = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.IntegerLookup(vocabulary=users_df, mask_value=None),
  tf.keras.layers.Embedding(input_dim=len(users_df) + 1, output_dim=embedding_dimension)
])

content_model = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.IntegerLookup(vocabulary=contents_df, mask_value=None),
  tf.keras.layers.Embedding(input_dim=len(contents_df) + 1, output_dim=embedding_dimension)
])

candidates=contents_ds.batch(metrics_batchsize).map(content_model)

metrics = tfrs.metrics.FactorizedTopK(
  candidates=candidates
)

task = tfrs.tasks.Retrieval(
  metrics=metrics
)

class ContentModel(tfrs.Model):

  def __init__(self, user_model, content_model):
    super().__init__()
    self.content_model: tf.keras.Model = content_model
    self.user_model: tf.keras.Model = user_model
    self.task: tf.keras.layers.Layer = task

  def compute_loss(self, features: Dict[Text, tf.Tensor], training=False) -> tf.Tensor:
    content_embeddings = self.content_model(features["content_id"])
    user_embeddings = self.user_model(features["user_id"])

    return self.task(user_embeddings, content_embeddings)

model = ContentModel(user_model, content_model)
model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=learning_rate))

cached_train = train.shuffle(view_size).batch(train_batchsize).cache()
cached_test = test.batch(test_batchsize).cache()

model.fit(cached_train, epochs=epochs)

model.evaluate(cached_test, return_dict=True)

index = tfrs.layers.factorized_top_k.BruteForce(model.user_model)
index.index(contents_ds.batch(index_batchsize).map(model.content_model), contents_ds)

user_id = 2
_, contents = index(tf.constant([user_id]))
print(f"Recommendations for user {user_id}: {contents}")
EN

回答 1

Stack Overflow用户

发布于 2022-01-17 12:32:42

您必须只为数据集提供正标签。例如,购买数据可能是每个用户的阳性样本。Tensorflow在批量负值抽样中计算训练模型。

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

https://stackoverflow.com/questions/66750232

复制
相关文章

相似问题

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