我只用很少的数据训练了一个时代的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'])
模型保存为h5文件。然后,保存模式加载与上面相同的模型。 batch_image
是一个图片文件。
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_crossentropy
。怎么了?我想再次强调一下,这个模型并没有真正受到数据训练。它几乎只是用随机权重进行初始化。
如果我没有很好地训练网络(还没有收敛),例如只是用随机数初始化权重,那么预测是否仍然是1, 0
?
如果我想获得预测概率,然后,我决定如何解释它,如何在CNN训练后获得概率预测输出?
答案 0 :(得分:2)
您的输出数量为201,这就是为什么您的输出为(1,201)而不是(1,0)。您可以通过使用np.argmax 轻松获取哪个类具有最高值,并且该类是模型给定输入的输出。
事实上,即使你只训练了一个时代,你的模型已经学会了一些非常蹩脚的东西,但是,它仍然学到了一些东西,并且基于此,它预测了输出
您已在最后一层使用softmax作为激活。它以非线性方式对输出进行标准化,以便所有类的输出总和等于1. 因此,您为每个类获得的值可以解释为该类作为给定输入的输出的概率通过模型。(为了更清晰,你可以看看softmax功能是如何工作的)
最后,每个类都有0.0049或类似的值,因为模型不确定您的输入属于哪个类。因此,它计算每个类的值,然后softmax将其标准化。这就是您的输出值在0到1范围内的原因。
例如,假设我有四个类,所以可能的输出之一可能像[0.223 0.344 0.122 0.311],最后我们看作每个类的置信度得分。通过查看每个班级的置信度得分,我们可以说预测班级为2,因为它的置信度得分最高为0.344。
答案 1 :(得分:0)
softmax图层的输出不是0或1.它实际上是一个归一化图层,加起来为1.如果你得到所有系数的总和,它们就会加起来。要获得预测,您应该获得具有最高值的预测。即使技术上没有,您也可以将它们解释为概率。 https://en.wikipedia.org/wiki/Softmax_function用于定义。
此层用于培训过程,以便能够比较分类分类和真实标签的预测。
优化需要优化,因为优化是在可导函数(具有梯度)上进行的,并且0,1输出不可导出(甚至不是连续的)。之后对所有这些值进行优化。
一个有趣的例子如下:如果你的真实目标是[0 0 1 0]
,你的预测输出[0.1 0.1 0.6 0.2]
,即使预测正确,它仍然可以学习,因为它仍然给出其他类的非零概率,您可以在其上计算梯度。
答案 2 :(得分:0)
为了获取类而不是概率形式的预测输出,请使用:
model.predict_classes(x_train,batch_size)
答案 3 :(得分:0)
我的理解是,Softmax说,价值在201个存储桶中降落在该存储桶中的可能性。有了第一个存储桶的确定性,您将得到[1,0,0,0,0 ........]。由于几乎没有进行过训练/学习/权重调整,因此201个值都约为0.00497,它们总计为1。 不错的description on developers.Google of SoftMax在这里
输出被指定为“ number_outputs”,因此您获得201个输出,每个输出都告诉您预测的可能性(即0到1之间的值)。