参数"键"的 dtype 必须<dtype: 'string'>,接收:<dtype: 'int32'>



我正在谷歌Colab中尝试查找表有问题如果我单独运行它,它也允许整数作为键,但在这个模型类中,我似乎无法将整数值作为键传递

class SimpleRecommender(tf.keras.Model):
def __init__(self, dummy_users, products,lenght_of_embedding):
super(SimpleRecommender, self).__init__()
self.products = tf.constant(products, dtype=tf.int32)
self.dummy_users = tf.constant(dummy_users, dtype=tf.string)
self.dummy_user_table = tf.lookup.StaticHashTable(tf.lookup.KeyValueTensorInitializer(self.dummy_users,range(len(dummy_users))), -1)
self.product_table = tf.lookup.StaticHashTable(tf.lookup.KeyValueTensorInitializer(tf.constant(self.products,dtype=tf.int32), range(len(products))), -1)

self.user_embedding = tf.keras.layers.Embedding(len(dummy_users), lenght_of_embedding)
self.product_embedding = tf.keras.layers.Embedding(len(products), lenght_of_embedding)

self.dot=tf.keras.layers.Dot(axes=-1)
def call(self,inputs):
user=inputs[0]
products=inputs[1]
user_embedding_index=self.dummy_user_table.lookup(user)
prod_embedding_index=self.dummy_user_table.lookup(products)
user_embedding_values=self.user_embedding(user_embedding_index)
prod_embedding_values=self.product_embedding(prod_embedding_index)
return self.dot([user_embedding_values,prod_embedding_values])
@tf.function
def call_item_item(self, product):
product_x = self.product_table.lookup(product)
pe = tf.expand_dims(self.product_embedding(product_x), 0)

all_pe = tf.expand_dims(self.product_embedding.embeddings, 0)#note this only works if the layer has been built!
scores = tf.reshape(self.dot([pe, all_pe]), [-1])

top_scores, top_indices = tf.math.top_k(scores, k=100)
top_ids = tf.gather(self.products, top_indices)
return top_ids, top_scores 

供参考

dummy_users
array(['pmfkU4BNZhmtLgJQwJ7x', 'UDRRwOlzlWVbu7H8YCCi',
'QHGAef0TI6dhn0wTogvW', ..., 'lcORJ5hemOZc1iGo9z7k',
'5CqDquDAszqJp27P7AL8', 'SSPNYxJMfuKhoe1dg24m'], dtype='<U20')

products
array([ 8650774,  9306139,  9961521, ..., 12058614, 12058615, 11927550])

当我运行以下代码时

sr1=SimpleRecommender(dummy_users,products,15)
sr1([tf.constant([['lcORJ5hemOZc1iGo9z7k'],['QHGAef0TI6dhn0wTogvW']]),
tf.constant([[8650774, 9306139, 9961521],[12058614, 12058615, 11927550]])])

我收到这个错误

TypeErrorTraceback (most recent call last)<ipython-input-24-5cd8170aa0e4> in <module>()
1 sr1=SimpleRecommender(dummy_users,products,15)
2 sr1([tf.constant([['lcORJ5hemOZc1iGo9z7k'],['QHGAef0TI6dhn0wTogvW']]),
----> 3      tf.constant([[8650774, 9306139, 9961521],[12058614, 12058615, 11927550]])])
1 frames
<ipython-input-21-1cc8d8700b6c> in call(self, inputs)
15         products=inputs[1]
16         user_embedding_index=self.dummy_user_table.lookup(user)
---> 17         prod_embedding_index=self.dummy_user_table.lookup(products)
18 
19         user_embedding_values=self.user_embedding(user_embedding_index)
TypeError: Exception encountered when calling layer "simple_recommender" (type SimpleRecommender).
Dtype of argument `keys` must be <dtype: 'string'>, received: <dtype: 'int32'>
Call arguments received:
• inputs=['tf.Tensor(shape=(2, 1), dtype=string)', 'tf.Tensor(shape=(2, 3), dtype=int32)']

任何帮助都将不胜感激感谢

我认为您在call方法中使用了错误的查找表。尝试将其替换为:

def call(self, inputs):
user = inputs[0]
products = inputs[1]
user_embedding_index = self.dummy_user_table.lookup(user)
prod_embedding_index = self.product_table.lookup(products)
user_embedding_values = self.user_embedding(user_embedding_index)
prod_embedding_values = self.product_embedding(prod_embedding_index)
return self.dot([user_embedding_values, prod_embedding_values])

整个工作示例:

import tensorflow as tf
class SimpleRecommender(tf.keras.Model):
def __init__(self, dummy_users, products,lenght_of_embedding):
super(SimpleRecommender, self).__init__()
self.products = tf.constant(products, dtype=tf.int32)
self.dummy_users = tf.constant(dummy_users, dtype=tf.string)
self.dummy_user_table = tf.lookup.StaticHashTable(tf.lookup.KeyValueTensorInitializer(self.dummy_users,range(len(dummy_users))), -1)
self.product_table = tf.lookup.StaticHashTable(tf.lookup.KeyValueTensorInitializer(tf.constant(self.products,dtype=tf.int32), range(len(products))), -1)

self.user_embedding = tf.keras.layers.Embedding(len(dummy_users), lenght_of_embedding)
self.product_embedding = tf.keras.layers.Embedding(len(products), lenght_of_embedding)

self.dot=tf.keras.layers.Dot(axes=-1)
def call(self,inputs):
user=inputs[0]
products=inputs[1]
user_embedding_index=self.dummy_user_table.lookup(user)
prod_embedding_index=self.product_table.lookup(products)
user_embedding_values=self.user_embedding(user_embedding_index)
prod_embedding_values=self.product_embedding(prod_embedding_index)
return self.dot([user_embedding_values,prod_embedding_values])
dummy_users = tf.constant(['lcORJ5hemOZc1iGo9z7k', 'UDRRwOlzlWVbu7H8YCCi','QHGAef0TI6dhn0wTogvW'])
products = tf.constant([ 8650774,  9306139,  9961521])
sr1=SimpleRecommender(dummy_users,products,15)
sr1([tf.constant([['lcORJ5hemOZc1iGo9z7k'],['QHGAef0TI6dhn0wTogvW']]),
tf.constant([[8650774, 9306139, 9961521],[8650774, 9306139, 9961521]])])

最新更新