如何在TensorFlow中选择交叉熵损失函数?
0 1021
1

在tensorflow中,至少有十二种不同的交叉熵损失函数:

  • 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
  • ...

哪一个仅适用于二进制分类,哪个适合多类问题?什么时候应该sigmoid代替使用softmax?sparse功能与其他有何不同?

收藏
2021-01-29 14:37 更新 anna •  5042
共 1 个回答
高赞 时间
0

Sigmoid 系列

  • tf.nn.sigmoid_cross_entropy_with_logits
  • tf.nn.weighted_cross_entropy_with_logits
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy (已弃用)

如前所述,sigmoid损失函数用于二进制分类。但是tensorflow函数更通用,并且在类独立时可以进行多标签分类。换句话说,tf.nn.sigmoid_cross_entropy_with_logits可以解决N个二进制分类。

标签必须是一键编码的,或者可以包含软分类概率。

此外,tf.losses.sigmoid_cross_entropy允许设置批量权重,这一点使它比其他示例更重要。

tf.nn.weighted_cross_entropy_with_logits允许设置类别权重 (请记住,分类是二进制的),即,使正误差大于负误差。当训练数据不平衡时,这很有用。

Softmax 系列

  • tf.nn.softmax_cross_entropy_with_logits (在1.5中弃用)
  • tf.nn.softmax_cross_entropy_with_logits_v2
  • tf.losses.softmax_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy (已弃用)

这些损失函数应用于多项互斥分类,即从N类中选择一种。也适用于N = 2的情况。

标签必须是一键编码的,或者必须包含软分类概率:一个特定示例可以以50%的概率属于A类,而以50%的概率属于B类。请注意,严格来讲,这并不意味着它同时属于这两个类,而是可以用这种方式解释概率。

就像在sigmoid系列中一样,tf.losses.softmax_cross_entropy允许批量设置权重,据我所知,从tensorflow 1.3开始,还没有内置的方法来设置类权重。

Sparse系列

  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • tf.losses.sparse_softmax_cross_entropy
  • tf.contrib.losses.sparse_softmax_cross_entropy (已弃用)

像softmax上面的普通函数一样,这些损失函数应用于多项互斥分类,即从N类中选择一个。区别在于标签编码:类被指定为整数(类索引),而不是向量。显然,这不允许使用软分类,但是当有成千上万个类时,它可以节省一些内存。但是,请注意,logits每个类的参数仍必须包含logits信息,因此它至少消耗[batch_size, classes]的内存。

像上面一样,tf.lossesversion允许批量设置参数。

Sampled softmax系列

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

这些函数为处理大量类提供了另一种选择。他们没有计算和比较精确的概率分布,而是从随机样本中计算损失。 参数weights和biases指定一个单独的完全连接层,该层用于计算所选样本的logit。

像上面一样,labels不是一次性编码,而是占[batch_size, num_true]的内存。

采样函数仅适用于训练。在测试期间,建议使用标准softmax损失函数来获得实际分布。

Via:https://stackoverflow.com/a/47034889/14964791

收藏
2021-01-29 14:54 更新 karry •  4540