TensorFlow/AutoKeras加载模型预测报错:NumPy数组转Tensor失败
AutoKeras加载保存模型预测CSV数据报NumPy转Tensor失败的解决方法
问题核心原因
报错ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float)90%以上的触发原因是待预测的object类型列中隐式存在np.nan空值——这类空值本身是float类型,混在object类型列中时,哪怕你做过全局类型转换,只要没提前把空值替换成固定类型值,转Tensor时就会识别到非法的float对象直接报错。
之前尝试的类型转换方案无效,本质是没处理混合类型的根源:直接对含np.nan的object列调用astype(str),只会把np.nan转成字符串"nan",但如果转换前存在列类型推断不一致、部分行值类型不匹配的问题,还是会残留float类型值;直接把DataFrame转numpy数组也会保留原列内的混合类型问题。
除此之外,直接传入DataFrame给AutoKeras加载后的模型、保存模型时未导出正式生产模型导致预处理层丢失,也会放大这个问题。
可直接落地的解决步骤
- 第一步:清洗待预测数据,彻底消除列内混合类型问题
先对空值做统一填充,再做类型转换,从根源去掉混存的float类型值:import numpy as np import pandas as pd df = df_from_csv_file.copy() # 处理数值列:填充空值后统一转float32,兼容TensorFlow默认类型要求 num_cols = df.select_dtypes(include=["int64", "float64"]).columns df[num_cols] = df[num_cols].fillna(0).astype(np.float32) # 处理object类型列:先把所有空值替换成固定字符串,再统一转str类型,彻底清除列内的float类型nan obj_cols = df.select_dtypes(include=["object"]).columns df[obj_cols] = df[obj_cols].fillna("missing").astype(str) - 第二步:调整输入格式,对齐AutoKeras结构化模型的输入要求
不要直接传入二维DataFrame或者numpy数组,转成「列名对应列值数组」的字典格式,和训练时AutoKeras自动解析的输入结构完全对齐:
可以跑一段校验代码确认没有残留的非法类型:predict_input = {col: df[col].values for col in df.columns}# 抽样检查前100行的元素类型,确认没有float混在object列 for col_name, col_values in predict_input.items(): type_set = set(type(v) for v in col_values[:100]) assert len(type_set) == 1, f"列{col_name}存在混合类型:{type_set}" - 第三步:修正模型保存/加载逻辑,避免预处理层丢失
如果之前是直接拿训练过程中的临时model对象保存,建议回到训练代码重新导出正式模型再存储,避免AutoKeras内置的分类特征编码、缺失值处理层丢失:# 训练完成后,从你的AutoKeras任务对象(StructuredDataClassifier/Regressor)导出正式模型 # 不要直接用fit过程中返回的临时model变量保存 final_model = ak_task.export_model() # ak_task替换成你初始化的AutoKeras任务变量名 final_model.save("model_autokeras", save_format="tf") # 加载模型时保留原有custom_objects参数即可 from tensorflow.keras.models import load_model import autokeras as ak loaded_model = load_model("model_autokeras", custom_objects=ak.CUSTOM_OBJECTS) - 第四步:执行预测
传入处理好的字典格式输入即可正常出结果:predicted = loaded_model.predict(predict_input)
常见踩坑提醒
- 不要在读取CSV时随意设置dtype参数强制转类型,否则会把空值位置的类型搞乱,必须先填充空值再转类型
- 如果object列是分类特征,不需要手动做独热编码或者标签编码,AutoKeras导出的模型内置了对应的预处理逻辑,手动编码反而会因为和训练时编码规则不一致导致预测结果错误
- 待预测数据的列名、列顺序必须和训练时完全一致,多列、少列、列名写错都会触发其他报错
内容的提问来源于stack exchange,提问作者lvfmc85
相关产品推荐
相关产品推荐

