拟合ML模型时报NumPy数组转Tensor错误该如何排查解决?
报错根因
错误触发和你猜测的归一化操作直接相关:tf.keras.preprocessing.Normalization层调用后返回的是TensorFlow EagerTensor类型,你直接将返回结果赋值给pandas DataFrame的列时,每个单元格存储的是Tensor实例而非纯数值。后续你将DataFrame转换为numpy数组时,数组元素类型为object(存储Tensor对象),模型拟合时要求输入为纯数值张量,转换失败就抛出了对应报错。
同时你当前的特征处理逻辑存在额外问题:特征列中包含TimeStamp日期格式、Version类别特征,未做数值化处理直接喂入模型也会导致训练异常。
修复方案
1. 修复归一化赋值逻辑
将归一化结果调用.numpy()方法转换为纯数值numpy数组后,再赋值给DataFrame:
# 原代码 # train_df[numeric_features] = normalizer(train_df[numeric_features].values) # 修改为 train_df[numeric_features] = normalizer(train_df[numeric_features].values).numpy() # 测试集归一化时也要做相同处理,避免验证阶段报错 test_df[numeric_features] = normalizer(test_df[numeric_features].values).numpy()
2. 完成非数值特征转换
- 对
TimeStamp日期列做拆解:可转换为时间戳数值,或拆解为年、月、日、星期几等离散/连续数值特征 - 对
Version列做编码:如果是离散类别特征,做独热编码或标签编码;如果是连续数值特征可直接保留,确认特征业务含义后选择对应处理方式即可。
3. 输入校验(可选)
模型拟合前可增加两行校验代码,提前排查格式问题:
# 确认特征数组为数值类型,不是object assert train_X.dtype in [np.float32, np.float64, np.int32, np.int64] # 确认标签数组为数值类型 assert train_Y.dtype in [np.float32, np.float64, np.int32, np.int64]
内容的提问来源于stack exchange,提问作者user16599218
相关产品推荐
相关产品推荐

