如何生成符合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
相关产品推荐
相关产品推荐

