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

如何生成符合categorical_crossentropy要求的多分类预测输出?

问题解决:调整y_pred形状适配categorical_crossentropy损失

现有5个3维数据点,对应0-9共10类标签,已用to_categorical将标签转为独热编码格式。当前随机初始化theta为(3,1),通过矩阵运算与sigmoid激活得到形状为(5,1)的y_pred,无法适配categorical_crossentropy损失的输入要求(需与y_true的(5,10)形状匹配),需调整得到符合要求的y_pred。


相关数据与代码

XTrain(5个3维数据点)

[[0.20861965 0.47901568 0.92075312], 
[0.96175914 0.70659989 0.82364516], 
[0.51805523 0.42727509 0.92545694], 
[0.4061363  0.55752676 0.56914541], 
[0.47859976 0.81323072 0.042954  ]]

原始标签y_true

[5 5 0 9 3] 

独热编码后的y_true(形状(5,10))

[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.], 
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.], 
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.], 
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.], 
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]] 

当前生成y_pred的代码(形状不匹配)

theta = np.random.normal(size=(3, 1))
a = np.matmul(XTrain, theta)
y_pred = tf.nn.sigmoid(a)

调整方案

核心是修正输出层维度与激活函数,适配10分类任务的要求:

  • 调整theta形状:从(3,1)改为(3,10),让矩阵运算后得到每个样本的10个类别得分,形状为(5,10)
  • 替换激活函数:用softmax替代sigmoid,将10个类别得分转换为和为1的概率分布,完美匹配独热编码的y_true格式

调整后的代码:

# 初始化theta为(3,10),对应3个输入特征到10个输出类别
theta = np.random.normal(size=(3, 10))
# 矩阵运算得到每个样本的10个类别得分,形状(5,10)
a = np.matmul(XTrain, theta)
# softmax激活生成概率分布,形状(5,10),与y_true完全匹配
y_pred = tf.nn.softmax(a)

补充说明:

  • sigmoid适用于二分类或多标签任务,每个输出独立计算概率;softmax适用于单标签多分类任务,保证所有类别概率和为1,这正是categorical_crossentropy要求的输入格式。
  • 调整后y_pred的形状(5,10)与y_true一致,可直接代入损失函数计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:55:47