tf.nn.sigmoid_cross_entropy_with_logits是否会将数据隐藏为概率?

时间:2018-10-12 07:02:18

标签: tensorflow machine-learning classification

在分类问题中,我们倾向于应用tf.nn.softmax函数,因为该函数将输出作为概率提供,或者我们也可以实现tf.nn.softmax_cross_entropy_with_logits,该函数将softmax激活函数应用于模型的输出。我想将数据分为两类。我遇到了一个代码,他们在最后一层使用了tf.nn.sigmoid_cross_entropy_with_logits。我想知道我们可以在最后一层使用Sigmoid作为激活函数吗?我们不应该使用softmax吗?如果不应用softmax,我怎么知道概率?因为在模型结束时,当我们检查模型的准确性时,我们使用以下命令

tf.equal(tf.argmax(y,axis=1),tf.argmax(y_,axis=1))

在最后一个完全连接的层上使用Sigmoid之后,我们可以使用上面的命令检查正确的预测吗?

2 个答案:

答案 0 :(得分:0)

Softmax用于将多个输出神经元的原始输出值转换为多类分类问题的概率。对于二进制分类问题,您可以使用一个输出神经元,而不是使用两个输出神经元,并且对输出值应用逻辑sigmoid function。当S型投影值在[0,1]范围内时,您将获得概率p。这是当前输入属于一个类别的概率。这样,输入属于另一类的概率为1 - p

对于您的特殊情况,请注意tf.nn.sigmoid_cross_entropy_with_logits的文档中说:

  

测量离散分类任务中的概率误差   每个类别都是独立的,而不是互斥的。对于   例如,可以执行多标签分类,其中一张图片   可以同时容纳大象和狗。

根据您发布的代码,我假设网络的输出维度大于1(否则argmax毫无意义),可能是2。这意味着该代码实际上执行了多个二进制分类,这些分类应该是独立的,但是您说过它应该是单个二进制分类。

如果我的假设正确,那么代码是错误的,因为两个独立的二进制分类与单个分类问题完全不同。实际上,y应该只有一个输出,您可以检查将其与目标进行比较的概率是否为> 0.5

答案 1 :(得分:0)

使用tf.nn.sigmoid_cross_entropy_with_logits的代码未执行多类分类,而是正在进行多标签分类,其中您有多个类,但这些不是排他的且是多个类可能会同时预测。

对于多标签情况,最好采用S型,因为这样您就可以为每个类别获得独立的概率。这种情况下的评估是不同的,您不能使用简单的准确性,而是使用每个类的精度/召回率。