Keras softmax激活,类别_交叉熵损失。但输出不是0,1

Keras softmax激活,类别_交叉熵损失。但输出不是0,1,keras,softmax,Keras,Softmax,我用很少的数据训练了一个时期的CNN模型。我使用Keras 2.05 这是CNN模型的(部分)最后两层,number\u outputs=201。训练数据输出是一个热编码201输出 model.add(Dense(200, activation='relu', name='full_2')) model.add(Dense(40, activation='relu', name='full_3')) model.add(Dense(number_outputs, activation='sof

我用很少的数据训练了一个时期的CNN模型。我使用Keras 2.05

这是CNN模型的(部分)最后两层,
number\u outputs=201
。训练数据输出是一个热编码201输出

model.add(Dense(200, activation='relu', name='full_2'))
model.add(Dense(40, activation='relu',  name='full_3'))
model.add(Dense(number_outputs, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
模型保存到h5文件中。然后,使用与上述相同的模型加载保存的模式<代码>批处理图像是一个图像文件

prediction = loaded_model.predict(batch_image, batch_size=1)
我得到这样的预测:

ndarray: [[ 0.00498065  0.00497852  0.00498095  0.00496987  0.00497506  0.00496112
   0.00497585  0.00496474  0.00496769  0.0049708   0.00497027  0.00496049
   0.00496767  0.00498348  0.00497927  0.00497842  0.00497095  0.00496493
   0.00498282  0.00497441  0.00497477  0.00498019  0.00497417  0.00497654
   0.00498381  0.00497481  0.00497533  0.00497961  0.00498793  0.00496556
   0.0049665   0.00498809  0.00498689  0.00497886  0.00498933  0.00498056
问题:

  • 预测数组应该是
    1,0
    ?为什么我会得到像输出激活为sigmoid这样的输出,而损失是
    binary\u crossentropy
    。怎么了?我想再次强调的是,这个模型并没有经过很好的数据训练。它几乎只是用随机权重初始化的

  • 如果我没有很好地训练网络(还没有收敛),比如只是用随机数初始化权重,那么预测是否仍然是
    1,0

  • 如果我想得到预测的概率,然后,我决定如何解释它,如何在CNN训练后得到概率预测输出


  • 您的输出数量是201,这就是为什么您的输出是(1201),而不是(1,0)。只需使用np.argmax就可以轻松地获得哪个类的值最高,并且该类是模型给定输入的输出

    事实上,即使您只训练了1个历元,您的模型也学到了一些可能非常蹩脚的东西,但它仍然学到了一些东西,并根据这些东西预测了输出

    您已将softmax用作最后一层中的激活。它以非线性方式规范化输出,以便所有类的输出之和等于1因此,您为每个类获得的值可以解释为该类作为模型给定输入的输出的概率。(为了更清楚,您可以了解softmax函数的工作原理)

    最后,每个类都有0.0049或类似的值,因为模型不确定输入属于哪个类。因此,它计算每个类的值,然后softmax将其标准化。这就是为什么输出值在0到1之间


    例如,假设我有四个类,那么其中一个可能的输出可能类似于[0.223 0.344 0.122 0.311],最后我们将其视为每个类的置信度分数。通过查看每个类别的置信度得分,我们可以说预测类别为2,因为它的最高置信度得分为0.344。

    softmax层的输出不是0或1。它实际上是一个标准化层,加起来等于1。如果你把所有系数相加,它们就会相加。要得到预测值,您应该得到具有最高值的预测值。你可以把它们解释为概率,即使在技术上没有。关于定义

    该层用于训练过程,以便能够比较分类预测和真实标签

    这是优化所必需的,因为优化是在可导函数(具有梯度)上进行的,并且0,1输出将不可导(甚至不连续)。然后对所有这些值进行优化


    一个有趣的例子如下:如果您的真实目标是
    [0 0 1 0]
    ,并且您的预测输出
    [0.1 0.1 0.6 0.2]
    ,即使预测是正确的,它仍然能够学习,因为它仍然为其他类提供非零概率,您可以在其上计算梯度。

    为了以类的形式而不是以概率的形式获得预测输出,请使用:

    model.predict_classes(x_train,batch_size)
    

    我的理解是,Softmax表示,在201个桶中,价值落地的可能性为该桶。你肯定会得到第一个桶[1,0,0,0……]。由于很少进行训练/学习/体重调整,因此201个值都约为0.00497,加起来等于1。 这里有个像样的


    输出被指定为“number\u outputs”,因此您得到201个输出,每个输出告诉您预测成为该输出的可能性(0到1之间的值)。

    感谢您的回复。实际上,我想弄明白为什么数组值不是1或0。例如,[0,0,1,…0,0],列表长度=201,现在它就像0.00498809。我知道总输出数是201。但是,值不是我所期望的。这是因为模型不确定您的输入属于哪个类。因此,它计算每个类的值,然后softmax将其标准化。这就是为什么输出值在0到1之间。例如,假设我有四个类,因此其中一个可能的输出可能类似于[0.223 0.344 0.122 0.311],最后我们将其视为每个类的置信度分数。通过查看每个班级的信心分数,我们可以说预测的班级是2,因为它的最高信心分数是0.344。我知道了!0.005(数组项值)*201约为1。输出是信心分数,我必须决定如何解释它。0.005是由于模型尚未训练。另一个问题与原始问题有点不一致。对于样本[0 0 1 0],图像1输出为[0.1 0.1 0.6 0.2],图像2输出为[0.25 0.3 0.2 0.25]。图1是与地面真实图像“接近”的图像。图2与地面实况图不“接近”。事实上,我希望CNN给我这样的预测,我知道模型一点也不自信,我可以扔掉第二个预测。以自动驾驶汽车为例,图1是道路。图2是一个图像,车已经在草地上了,我还没有训练它在草地上行驶,车应该停下来。我知道CNN不会给我好的结果。请评论。thxnp.argmax(preds,axis=1)是您的朋友。