AutoKeras NAS脚本执行失败,请求排查原因及解决方案
可能的核心原因
自定义分块加载的兼容性问题
AutoKeras对数据输入格式有严格要求,若使用自定义迭代器而非TensorFlow原生tf.data.Dataset加载数据,易出现迭代器状态异常,导致训练后评估阶段无法正确初始化内部查找表(Table)。自定义分块逻辑若存在数据形状不一致、迭代器未重置等问题,也会触发该错误。AutoKeras与TensorFlow版本兼容性bug
AutoKeras v1.0.17与TensorFlow v2.8.0的组合存在已知的内部层初始化问题,尤其是在神经网络搜索完成后调用评估时,部分内部Keras层的查找表未被正确初始化。独热编码标签的适配问题
AutoKeras的分类器默认期望输入整数型类别索引标签,而非独热编码格式。强行传入独热标签会导致损失函数、指标计算模块的内部表初始化失败。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

