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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:09