Learning to rank算法TensorFlow报错:无法将NumPy数组转为Tensor(不支持int类型)
问题根因与解决方案
1. 列数据类型异常导致转换失败
读取csv后如果id_comm、id_huurder列存在空值/异常值,pandas会自动将整列设为object dtype,而非预期的数值类型,转换张量时就会触发Unsupported object type int报错。
- 排查方法:执行
print(df_succes[['id_comm', 'id_huurder']].dtypes)确认列类型 - 修复代码:
# 强制转换为int类型,处理异常值 df_succes['id_comm'] = pd.to_numeric(df_succes['id_comm'], errors='coerce').fillna(0).astype(int) df_succes['id_huurder'] = pd.to_numeric(df_succes['id_huurder'], errors='coerce').fillna(0).astype(int)
2. StringLookup层配置不匹配数值类型id
你用到的unique_user_ids和unique_movie_titles都是int类型,StringLookup层默认适配字符串输入,需要显式指定dtype:
# 用户嵌入部分修改 self.user_embeddings = tf.keras.Sequential([ tf.keras.layers.StringLookup( vocabulary=unique_user_ids, mask_token=None, dtype=tf.int64), tf.keras.layers.Embedding(len(unique_user_ids) + 1, embedding_dimension) ]) # 商品嵌入部分同步修改 self.movie_embeddings = tf.keras.Sequential([ tf.keras.layers.StringLookup( vocabulary=unique_movie_titles, mask_token=None, dtype=tf.int64), tf.keras.layers.Embedding(len(unique_movie_titles) + 1, embedding_dimension) ])
3. 输入格式不符合TFRS模型要求
MovielensModel的call方法要求输入是包含user_id、movie_title键的字典,但你原代码训练时直接传入了X_train张量,且没有对应user_rating标签字段,需要重构输入数据集:
# 拆分数据集时保留字段格式,不要提前转成无字段的张量 train_ds = tf.data.Dataset.from_tensor_slices({ "user_id": X_train['id_huurder'].values, "movie_title": X_train['id_comm'].values, "user_rating": y_train.values }) test_ds = tf.data.Dataset.from_tensor_slices({ "user_id": X_test['id_huurder'].values, "movie_title": X_test['id_comm'].values, "user_rating": y_test.values }) # 分批处理 train_ds = train_ds.batch(32) test_ds = test_ds.batch(32)
4. 优化器参数错误
你设置的学习率为-0.1是非法值,会导致训练不收敛,修改为正的小数值:
model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=0.1))
5. 训练调用修改
直接传入构造好的数据集即可:
model.fit(train_ds, epochs=3, validation_data=test_ds)
内容的提问来源于stack exchange,提问作者Karin L
相关产品推荐
相关产品推荐

