在Tensorflow分类中,当使用“时,标签是如何排序的?”;预测;?

在Tensorflow分类中,当使用“时,标签是如何排序的?”;预测;?,tensorflow,Tensorflow,我正在使用MNIST手写数字数据集来训练CNN 在训练模型后,我使用如下预测: predictions = cnn_model.predict(test_images) predictions[0] model.fit(train_images, train_labels, batch_size=BATCH_SIZE, epochs=EPOCHS) predictions = cnn_model.predict(test_images) 我得到的输出是: array([2.1273775e-

我正在使用MNIST手写数字数据集来训练CNN

在训练模型后,我使用如下预测:

predictions = cnn_model.predict(test_images)
predictions[0]
model.fit(train_images, train_labels, batch_size=BATCH_SIZE, epochs=EPOCHS)
predictions = cnn_model.predict(test_images)
我得到的输出是:

array([2.1273775e-06, 2.9292005e-05, 1.2424786e-06, 7.6307842e-05,
       7.4305902e-08, 7.2301691e-07, 2.5368356e-08, 9.9952960e-01,
       1.2401938e-06, 1.2787555e-06], dtype=float32)
在输出中,有10个概率,0到9之间的数字每个概率一个。但我怎么知道哪个概率指的是哪个数字呢

在该特定情况下,针对数字0到9顺序排列概率。但为什么呢?我没有给它下定义

我试着浏览互联网上其他地方的文档和示例实现,但似乎没有人解决过这种特殊行为

编辑:

在上下文中,我通过以下方式定义了我的训练/测试数据:

mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = (np.expand_dims(train_images, axis=-1)/255.).astype(np.float32)
train_labels = (train_labels).astype(np.int64)
test_images = (np.expand_dims(test_images, axis=-1)/255.).astype(np.float32)
test_labels = (test_labels).astype(np.int64)
我的模型由几个凝聚层和池层组成,然后是一个扁平层,然后是一个有128个神经元的密集层和一个有10个神经元的输出密集层

之后,我简单地拟合我的模型并使用如下预测:

predictions = cnn_model.predict(test_images)
predictions[0]
model.fit(train_images, train_labels, batch_size=BATCH_SIZE, epochs=EPOCHS)
predictions = cnn_model.predict(test_images)
我不知道我在哪里指示我的代码将第一个神经元输出为数字0,第二个神经元输出为数字1等等 如果我想改变结果数字输出的顺序,我该在哪里做呢?
这真的让我很困惑。

这取决于您在培训期间如何准备标签。对于MNIST分类,通常有两种不同的方法:

  • 一个热标签:MNIST数据中有10个标签,因此对于每个示例(图像),您创建一个长度为10的标签数组(向量),其中除与输入图像显示的数字对应的索引外,所有元素均为零。例如,如果输入图像显示数字8,则标签除第8个索引(例如[0,0,0,0,0,0,0,0,0,0])外,其余位置均包含零。如果您的图像显示的是数字2,则标签将类似于[0,0,1,0,0,0,0,0]等等
  • 稀疏标签:您只需直接按图像显示的数字为每个图像添加标签,例如,如果图像显示的是数字8,则标签是一个值为8的单个数字
  • 在这两种情况下,您可以根据需要选择标签,在MNIST分类中,使用标签0-9来显示数字0-9是很直观的

    因此,在预测中,索引0处的概率表示数字0,索引1表示数字1,依此类推

    您可以选择以不同的方式准备标签。例如,您可以决定按如下方式显示标签:

    • 数字0的标签:9
    • 数字1:8的标签
    • 数字2:7的标签
    • 数字3:6的标签
    • 数字4:5的标签
    • 数字5的标签:4
    • 数字6:3的标签
    • 数字7的标签:2
    • 数字8的标签:1
    • 数字9的标签:0
    你可以用同样的方法训练你的模型,但是在这种情况下,预测中的概率会被颠倒。索引0处的概率表示数字9,索引1表示数字8,依此类推


    简言之,您必须使用整数索引定义标签,但这取决于您决定并记住您选择的索引引用哪个标签/类别。

    模型使用数字。您的类/标签应以数字表示(例如,
    0、1、…、n
    )。预测总是被索引,以显示索引
    0
    处的类
    0
    、索引
    1处的类
    1
    的概率。现在在MNIST的例子中,您很幸运标签是整数
    0
    9
    。假设你必须将图像分为三类:汽车、自行车、卡车。必须将这些类表示为数值。你可以随意安排。如果您选择:{汽车:0,自行车:1,卡车:2,换句话说,如果您将汽车标记为0,自行车标记为1,卡车标记为2,那么您的预测将显示指数为0的汽车、指数为1的自行车和指数为2的卡车的概率

    您还可以选择以下设置:{cars:2、自行车:0、卡车:1,然后您的预测将显示指数2处的汽车、指数0处的自行车和指数1处的卡车的概率,依此类推

    关键是,您必须显示从0n整数,其中n
    num\u classes-1
    。你在预测时的概率会被这样索引。你不必告诉模特


    希望这一点现在清楚了。

    我想我理解你的意思,但当我与我的代码进行比较时,我得到的标签是稀疏编码的,而我的网络有一个10个节点的输出层。我还没有定义从稀疏到热的映射。这就是我想弄明白的。顺便说一下,这里是完整代码的链接:是的,tensorflow mnist数据集的标签是稀疏的。标签的范围在0到9之间,并且它们也同样被索引。因此,您的预测概率也会按此进行索引@Zainkhaishagi当你说它们是“这样索引的”时,你是什么意思?在哪里确认或更改此索引?如果我希望第一个输出是数字5,第二个输出是数字8等,我会在哪里进行这样的更改@Bashir Kazimiyou将数字5热编码为:[1,0,0,0,0,0,0,0],数字8热编码为[0,1,0,0,0,0,0,0]等等。在稀疏标签的情况下,您只需创建一个空标签数组,在任何索引中,您都可以将数字5设置为0,将数字8设置为1。等等。也许我遗漏了一些基本的东西,但我还是不明白。我已经编辑了我的问题,添加了如何定义测试/训练标签的代码。它们是稀疏的。之后,我简单地拟合模型并使用predict。我仍然不知道我在哪里指示模型按照输出结果的顺序输出结果。