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

AutoKeras NAS脚本执行失败,请求排查原因及解决方案

问题原因与排查方案

可能的核心原因

  1. 自定义分块加载的兼容性问题
    AutoKeras对数据输入格式有严格要求,若使用自定义迭代器而非TensorFlow原生tf.data.Dataset加载数据,易出现迭代器状态异常,导致训练后评估阶段无法正确初始化内部查找表(Table)。自定义分块逻辑若存在数据形状不一致、迭代器未重置等问题,也会触发该错误。

  2. AutoKeras与TensorFlow版本兼容性bug
    AutoKeras v1.0.17与TensorFlow v2.8.0的组合存在已知的内部层初始化问题,尤其是在神经网络搜索完成后调用评估时,部分内部Keras层的查找表未被正确初始化。

  3. 独热编码标签的适配问题
    AutoKeras的分类器默认期望输入整数型类别索引标签,而非独热编码格式。强行传入独热标签会导致损失函数、指标计算模块的内部表初始化失败。

  4. Kepler架构的底层兼容性限制
    GTX 780属于Kepler架构,是CUDA 11.x支持的最后一代旧架构,TensorFlow v2.8.0在该架构上的部分算子优化存在兼容性问题,可能导致训练过程中模型内部状态未正确保存,评估时触发表未初始化错误。

具体排查与修复步骤

  • 重构数据加载管道
    替换自定义分块加载逻辑,使用TensorFlow原生tf.data.Dataset加载数据,示例代码如下:

    import tensorflow as tf
    import numpy as np
    import os
    
    def load_npy_file(file_path):
        data = np.load(file_path.numpy())
        features = data[:, :9]
        labels = np.argmax(data[:, 9:], axis=1)  # 转换为整数标签
        return features, labels
    
    def create_dataset(dir_path, batch_size=32):
        file_list = [os.path.join(dir_path, f) for f in os.listdir(dir_path) if f.endswith('.npy')]
        dataset = tf.data.Dataset.from_tensor_slices(file_list)
        dataset = dataset.map(lambda x: tf.py_function(load_npy_file, [x], [tf.float32, tf.int32]), num_parallel_calls=tf.data.AUTOTUNE)
        dataset = dataset.unbatch().batch(batch_size).prefetch(tf.data.AUTOTUNE)
        return dataset
    
    train_ds = create_dataset('train_data_npy')
    valid_ds = create_dataset('valid_data_npy')
    

    确保训练与验证数据集的特征形状、标签类型完全一致。

  • 调整版本组合
    尝试降级AutoKeras至v1.0.16,或升级至v1.0.18,同时确认TensorFlow版本保持在v2.7.x或v2.8.x,避免版本不兼容导致的内部bug。

  • 转换标签格式
    将独热编码标签转换为整数型类别索引(如上述代码中的np.argmax),符合AutoKeras分类任务的默认输入要求。

  • 优化CUDA环境配置
    在运行脚本前设置环境变量,避免显存分配异常:

    export TF_FORCE_GPU_ALLOW_GROWTH=true
    

    同时确认cuDNN文件已正确放置在CUDA的include和lib64目录下,权限配置正常。

  • 修正评估流程
    搜索完成后,先导出最佳模型再执行评估,而非直接调用tuner的evaluate方法:

    from autokeras import StructuredDataClassifier
    
    tuner = StructuredDataClassifier(max_trials=10)
    tuner.fit(train_ds, validation_data=valid_ds)
    best_model = tuner.get_best_model(num_models=1)[0]
    loss, accuracy = best_model.evaluate(valid_ds)
    

内容的提问来源于stack exchange,提问作者user366312

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:21:02