我查看了所有的快速入门教程,并使用检索示例将其调整为我的数据集。views_df
包含对user_ids
和content_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度量的计算吗?
提前感谢
代码
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}")
发布于 2022-01-17 12:32:42
您必须只为数据集提供正标签。例如,购买数据可能是每个用户的阳性样本。Tensorflow在批量负值抽样中计算训练模型。
https://stackoverflow.com/questions/66750232
复制相似问题