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

使用TensorFlow做Kaggle泰坦尼克号任务时categorical_crossentropy报错如何处理

问题根因
  • 损失函数与标签格式不匹配:categorical_crossentropy要求输入的标签是形状为(样本数, 类别数)的独热编码矩阵,你当前使用的Survived列是形状为(891, 1)的整数标签,不符合输入要求。
  • 输出层配置错误:二分类任务使用softmax激活时,输出层神经元数量需要对应类别数(即2),你设置的1个神经元输出softmax结果永远为1,无法完成分类判断。
  • 原代码遗漏缺失值处理:Age列存在空值,不处理也会导致训练报错。
修复方案

下面提供三种常用的可行修复方式:

方案1:适配二分类场景的最简修改(推荐)

二分类任务直接使用sigmoid激活配合binary_crossentropy损失,无需修改原标签格式,修改后代码如下:

import pandas as pd
import numpy as np
import tensorflow as tf

train_data = pd.read_csv('train.csv')
x_data = train_data[['Pclass', 'Sex', 'Age', 'SibSp',
       'Parch', 'Fare']]
x_data = pd.get_dummies(x_data)
# 补全Age列缺失值
x_data = x_data.fillna(x_data.mean())
y_data = train_data[['Survived']]

X = tf.keras.layers.Input(shape=[7])
# 二分类用sigmoid激活,输出1个神经元对应0/1分类概率
Y = tf.keras.layers.Dense(1, activation = 'sigmoid')(X)
model = tf.keras.models.Model(X, Y)
# 损失换为binary_crossentropy
model.compile(loss = 'binary_crossentropy', metrics = ['accuracy'])

model.fit(x_data, y_data, epochs=10)

方案2:沿用原逻辑修复,适配categorical_crossentropy要求

如果要保留使用categorical_crossentropy,需要同时修改标签格式和输出层配置:

import pandas as pd
import numpy as np
import tensorflow as tf
from keras.utils import to_categorical

train_data = pd.read_csv('train.csv')
x_data = train_data[['Pclass', 'Sex', 'Age', 'SibSp',
       'Parch', 'Fare']]
x_data = pd.get_dummies(x_data)
x_data = x_data.fillna(x_data.mean())
y_data = train_data[['Survived']]
# 标签转独热编码,形状变为(891, 2)
y_data = to_categorical(y_data)

X = tf.keras.layers.Input(shape=[7])
# 输出层改为2个神经元对应两个类别,用softmax激活
Y = tf.keras.layers.Dense(2, activation = 'softmax')(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss = 'categorical_crossentropy', metrics = ['accuracy'])

model.fit(x_data, y_data, epochs=10)

方案3:使用sparse_categorical_crossentropy无需修改标签格式

如果不想修改标签的整数格式,也可以按报错提示更换损失函数,同时调整输出层配置:

import pandas as pd
import numpy as np
import tensorflow as tf

train_data = pd.read_csv('train.csv')
x_data = train_data[['Pclass', 'Sex', 'Age', 'SibSp',
       'Parch', 'Fare']]
x_data = pd.get_dummies(x_data)
x_data = x_data.fillna(x_data.mean())
y_data = train_data[['Survived']]

X = tf.keras.layers.Input(shape=[7])
Y = tf.keras.layers.Dense(2, activation = 'softmax')(X)
model = tf.keras.models.Model(X, Y)
# 损失换为sparse_categorical_crossentropy,支持整数标签
model.compile(loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

model.fit(x_data, y_data, epochs=10)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:36:02