使用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
相关产品推荐
相关产品推荐

