Keras-TensorFlow图执行错误求助:序列神经网络拟合数据集失败
解决Keras Graph Execution Error问题
以下是针对你代码中可能触发错误的核心问题及修复方案:
1. 任务类型与模型配置不匹配
你的模型最后一层设为Dense(1),损失函数用mae(均绝对误差,适用于回归任务),但如果Type是分类变量(比如字符串类型的类别标签,如"Male"/"Female"/"Infant"),这种配置完全不兼容,会直接触发Graph Execution Error。
修复方案(分类任务):
- 标签编码:将字符串标签转成整数编码
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y_train = le.fit_transform(df_train.Type) y_valid = le.transform(df_valid.Type) - 调整输出层:根据类别数量设置神经元数,添加
softmax激活num_classes = len(le.classes_) model3 = keras.Sequential([ layers.Dense(512, activation='relu', input_shape=[X_train.shape[1]]), layers.Dense(512, activation='relu'), layers.Dense(512, activation='relu'), layers.Dense(num_classes, activation='softmax'), # 修改此处 ]) - 更换损失函数:使用稀疏分类交叉熵(适配整数标签)
model3.compile( optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"] # 分类任务添加准确率指标 )
若Type是数值型的回归任务,需确保y_train为数值类型且无缺失值,可跳过此部分。
2. 数据类型与格式问题
Keras对pandas DataFrame支持较好,但标签为object类型等不兼容情况会触发图执行错误,建议将数据转为numpy数组:
X_train = X_train.to_numpy().astype('float32') X_valid = X_valid.to_numpy().astype('float32') y_train = y_train.to_numpy().astype('int32') # 分类用int,回归用float y_valid = y_valid.to_numpy().astype('int32')
3. 缺失必要导入语句
运行代码前必须添加以下导入:
import pandas as pd from sklearn.model_selection import train_test_split from tensorflow import keras from tensorflow.keras import layers
4. 归一化潜在问题
若训练集某列所有值相同(max等于min),会出现除以0的错误,建议提前检查并删除此类列:
zero_cols = (X_train.max() == X_train.min()) if zero_cols.any(): print("以下列所有值相同,已删除:", zero_cols[zero_cols].index) X_train = X_train.drop(zero_cols[zero_cols].index, axis=1) X_valid = X_valid.drop(zero_cols[zero_cols].index, axis=1)
完整修复后示例代码
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow import keras from tensorflow.keras import layers df=pd.read_csv("abalone.csv") df_train,df_valid=train_test_split(df,train_size=0.7) # 处理分类标签 le = LabelEncoder() y_train = le.fit_transform(df_train.Type) y_valid = le.transform(df_valid.Type) X_train,X_valid=df_train.drop("Type",axis=1),df_valid.drop("Type",axis=1) # 检查并删除常量列 zero_cols = (X_train.max() == X_train.min()) if zero_cols.any(): X_train = X_train.drop(zero_cols[zero_cols].index, axis=1) X_valid = X_valid.drop(zero_cols[zero_cols].index, axis=1) # 归一化 max_=X_train.max() min_=X_train.min() X_train=(X_train-min_)/(max_-min_) X_valid=(X_valid-min_)/(max_-min_) # 转换为numpy数组 X_train = X_train.to_numpy().astype('float32') X_valid = X_valid.to_numpy().astype('float32') y_train = y_train.astype('int32') y_valid = y_valid.astype('int32') # 构建模型 num_classes = len(le.classes_) model3 = keras.Sequential([ layers.Dense(512, activation='relu', input_shape=[X_train.shape[1]]), layers.Dense(512, activation='relu'), layers.Dense(512, activation='relu'), layers.Dense(num_classes, activation='softmax'), ]) # 编译模型 model3.compile( optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"] ) # 训练模型 history = model3.fit( X_train, y_train, validation_data=(X_valid, y_valid), batch_size=256, epochs=10, )
内容的提问来源于stack exchange,提问作者Anas Abid
相关产品推荐
相关产品推荐

