Keras MNIST目标向量自动转换为one-hot?

use*_*467 5 python neural-network keras tensorflow

mnist当我从 Keras加载数据集时,我得到 4 个变量 -

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
Run Code Online (Sandbox Code Playgroud)

的形状x_train(60000, 28, 28),这是有道理的,因为它包含 60,000 张 28x28 图片

的形状y_train正好(60000,)表明它是一个包含数字目标标签(0-9)的一维向量。

为了进行数字分类,神经网络通常输出一个具有十个维度的单热编码向量。我认为我需要使用to_categorical将 y 目标从数值转换为分类,以便使神经网络的形状输出与训练样本相匹配,这可能是(60000, 10)

但在我在网上找到的一些示例中,to_categorical从未用于重塑训练向量。当神经网络的输出层y_train.shape保持不变时(60000,)

 model.add(Dense(10, activation="softmax"))
Run Code Online (Sandbox Code Playgroud)

它输出一个 10-D one-hot 向量。

然后他们简单地训练模型就y_train没有问题

model.fit(x_train, y_train, epochs=2, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

这怎么可能?神经网络的输出形状是否会与 不(60000, 10)兼容(60000,)?或者 Keras 是否自动将分类输出转换为数字?

编辑:更清楚地说,我知道如何对其进行一次性编码,但我的问题是为什么他们不这样做。在该示例中,网络在没有对目标类进行 one-hot 编码的情况下工作,而网络的输出显然是 one-hot 编码的。

编辑:罗辛是对的。这只是使用sparse_crossentropy损失的效果,而不是分类损失。

Ros*_*hel 4

将损失函数更改为

loss = 'sparse_categorical_crossentropy'
Run Code Online (Sandbox Code Playgroud)

这将起作用,并且您不必更改输入数据形状