Keras softmax 激活,category_crossentropy 损失。但输出不是0、1

use*_*147 5 keras softmax

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

这是 CNN 模型的(部分)最后 2 层number_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'])
Run Code Online (Sandbox Code Playgroud)

模型保存为 h5 文件。然后,保存的模式将加载与上面相同的模型。batch_image是一个图像文件。

prediction = loaded_model.predict(batch_image, batch_size=1)
Run Code Online (Sandbox Code Playgroud)

我得到这样的预测:

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
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 预测数组应该是1, 0?为什么我得到的输出像输出激活为 sigmoid,而损失是binary_crossentropy. 怎么了?我想再次强调,该模型并没有真正用数据进行良好的训练。它几乎只是用随机权重初始化。

  2. 如果我没有很好地训练网络(尚未收敛),例如只是用随机数初始化权重,那么预测仍然是吗1, 0

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

Sar*_*dak 4

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

事实上,即使你只训练了 1 个周期,你的模型也学到了一些可能非常蹩脚的东西,但它仍然学到了一些东西,并基于此,它预测了输出。

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

最后,每个类别都有 0.0049 或类似的值,因为模型不确定您的输入属于哪个类别。因此,它计算每个类别的值,然后使用 softmax 对其进行归一化。这就是为什么你的输出值在 0 到 1 的范围内。

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