Python Keras MNIST目标向量自动转换为一个hot?

Python Keras MNIST目标向量自动转换为一个hot?,python,tensorflow,keras,neural-network,Python,Tensorflow,Keras,Neural Network,当我从Keras加载mnist数据集时,我得到4个变量- (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train的形状是(60000,28,28),这很有意义,因为它包含60000个28x28图片 y\u列的形状仅为(60000,),这表明它是一个一维向量,包含数字目标标签(0-9) 为了进行数字分类,神经网络通常输出一个热编码向量,该向量有十个维度。我想我需要使用来进行分类来将y目标从数字

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

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train
的形状是
(60000,28,28)
,这很有意义,因为它包含60000个28x28图片

y\u列的形状仅为
(60000,)
,这表明它是一个一维向量,包含数字目标标签(0-9)

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

但在我在网上找到的几个例子中,
to_category
从未被用来重塑训练向量<编码>y_序列。形状
保持
(60000,)
,而神经网络的输出层保持不变

 model.add(Dense(10, activation="softmax"))
输出一个10-D一维热矢量

然后,他们简单地在
y\u train
上训练模型,没有问题

model.fit(x_train, y_train, epochs=2, validation_data=(x_test, y_test))
这怎么可能?神经网络的输出不是与
(60000,10)
不兼容吗?还是Keras会自动将分类输出转换为数字


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


编辑:Roshin是对的。这仅仅是使用稀疏交叉熵的一种效果,而不是分类损失。

您可以通过执行以下代码行将其转换为一个热点:

(x_train, l_train), (x_test, l_test) = mnist.load_data()
y_train = np.zeros((l_train.shape[0], l_train.max()+1), dtype=np.float32)
y_train[np.arange(l_train.shape[0]), l_train] = 1
y_test = np.zeros((l_test.shape[0], l_test.max()+1), dtype=np.float32)
y_test[np.arange(l_test.shape[0]), l_test] = 1

将损失函数更改为

loss = 'sparse_categorical_crossentropy'

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

我知道如何对其进行热编码,但我的问题是他们为什么不这样做。在这个例子中,网络在没有对目标类进行一次热编码的情况下工作,而网络的输出显然是一次热编码。他们可以使用稀疏的分类交叉熵而不是分类交叉熵来训练模型。如果您的目标标签是要与softmax one热输出进行比较的整数,则使用稀疏\u分类\u交叉熵。您是对的。但是为什么呢?分类和稀疏有什么区别?我知道以前有人回答过这个问题,但为什么它会影响数据形状?我想这个问题会回答您的疑问: