Tensorflow入门——分类问题cross_entropy的选择

Tensorflow中有一大堆cross_entropy损失函数用于处理分类问题,初学者往往会一脸懵逼,不知道如何选择。

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ….

1. 名词解释

其实如果我们理解了里面出现的几个关键词,很多问题就一目了然了。

  • Logit (Score)

    分类器给(比如图片)属于每个类别所打的分数

  • Softmax

    将Logit的分数转换成概率,属于每个类别的概率,数值0到1之间

  • Sigmoid

    与Softmax功能一样将Logit的分数转换成概率,只不过Sigmoid仅支持类别个数为2二分类问题,Softmax支持更多类别的分类问题。

  • Onehot (lables)

    一种只用0和1的编码方式,比如有三类,非Onehot的标签可以标为0,1和2。转换成Onehot之后就分别变成[1,0,0],[0,1,0]和[0,01]了。

  • Cross-Entropy(交叉熵)

    计算分类器算出的属于各个类的概率,与(Onehot)标签的差距,用于评价分类器表现

注意所有的损失函数都接受Logits而不必手动通过sigmoid或者softmax转换成概率

2. Sigmoid vs Softmax

正如前面提到,如果是二分问题可以选用Sigmoid的损失函数,如果类别大于两个,最好选用Softmax。

读者应该知道这下面两个怎么选了吧

  • tf.losses.sigmoid_cross_entropy
  • tf.losses.softmax_cross_entropy

3. nn and Logits

tf.nn.sigmoid_cross_entropy_with_logitstf.losses.sigmoid_cross_entropy的差别是,前者输出的是一堆Logits向量,后者输出的是一个数loss

f.losses.sigmoid_cross_entropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits)

4. Weight

tf.losses.sigmoid_cross_entropy 和 tf.losses.softmax_cross_entropy 都支持权重Weight,默认Weight为1,当w为标量的时候

tf.losses.sigmoid_cross_entropy(weight = w) = w* tf.losses.sigmoid_cross_entropy(weight = 1)

当W为向量的时候,权重加在每一个logits上再Reduce Mean.

f.losses.sigmoid_cross_entropy(weight = W) = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits*W)

加上权重之后,在训练的时候能使某些sample比其他更加重要。

关于tf.nn.weighted_cross_entropy_with_logits` 有一个pos_weight 与前面讲到的sample Weight不同,这个pos_weight是Class Weight用来,对于 unbalanced数据非常有用。

5. Sparse

  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • tf.losses.sparse_softmax_cross_entropy

Sparse的 softmax cross_entropy与普通的softmax cross唯一的区别是,其标签没有Onehot编码。

在类别数量巨大的时候,这种方式可以减少内存占用。

6. Sampled Softmax

另外一种减少内存占用的方式,直接对类别进行抽样训练。注意这些loss函数仅能在训练的时候使用,验证的时候不要使用。sampled softmax function如下

  • tf.nn.sampled_softmax_loss
  • tf.contrib.nn.rank_sampled_softmax_loss
  • tf.nn.nce_loss

参考资料

https://stackoverflow.com/questions/47034888/how-to-choose-cross-entropy-loss-in-tensorflow

https://www.tensorflow.org/api_docs/


首发steemit

欢迎扫描二维码关注我的微信公众号“tensorflow机器学习”,一起学习,共同进步

image

你可能感兴趣的:(Tensorflow入门——分类问题cross_entropy的选择)