You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:39:21