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

MNIST分类中Softmax输出层对应目标数据格式的技术疑问

为什么Softmax输出搭配一维整数标签也能正常训练?

你提的这个问题其实是TensorFlow/Keras损失函数设计的实用细节,核心原因在于你选用了sparse_categorical_crossentropy损失函数——它就是专门为整数形式的类别索引量身打造的,不需要手动把标签转换成和输出层维度一致的one-hot编码二维数组。

两种交叉熵损失的核心区别

  • categorical_crossentropy:要求标签是one-hot编码的二维数组(比如MNIST场景下是(60000, 10)的形状),每个样本对应一个长度等于类别数的向量,正确类别位置为1,其余为0。
  • sparse_categorical_crossentropy:接受一维的整数索引(也就是你看到的(60000,)形状),每个元素是0到9的整数,代表样本所属的类别。它会在内部自动把这些整数标签转换成对应的one-hot形式,再和Softmax输出的概率分布计算交叉熵。

这个设计的意义是什么?

最直接的好处是节省内存。MNIST的60000个样本,如果用one-hot编码存储标签,需要60000×10=600000个浮点数;而用整数存储只需要60000个整数,内存占用差了一个数量级,对于超大数据集来说这个优化能显著降低存储压力。

可以自己验证这个逻辑

你可以尝试把标签转成one-hot编码,再换用普通交叉熵损失,训练效果会和原代码完全一致:

# 将整数标签转换为one-hot编码
y_train_onehot = tf.keras.utils.to_categorical(y_train, 10)
y_test_onehot = tf.keras.utils.to_categorical(y_test, 10)

# 重新编译模型,替换损失函数为categorical_crossentropy
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 启动训练,结果和原代码无差异
r = model.fit(x_train, y_train_onehot, validation_data=(x_test, y_test_onehot), epochs=10)

官方文档的明确说明

在TensorFlow的官方文档中,sparse_categorical_crossentropy的参数说明里清晰提到:

标签应为整数张量。如果您使用one-hot编码的标签,请改用categorical_crossentropy。

所以这并不是Softmax的特例,而是损失函数的适配设计——Softmax输出的多类别概率分布,既可以搭配one-hot标签用普通交叉熵,也可以搭配整数标签用稀疏版交叉熵,后者帮你省去了手动转换标签的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:57:29