在tf.nn下带有“cross_entropy”的损失函数,入参logits都是没有sigmoid或softmax之前的数据,函数会自动来计算。
输出是每个样本的loss,一般需要配合tf.reduce_mean(loss)使用。
1 输入的labels是需要one-hot之后的tensor的函数。
1.1 sigmoid_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)
可以实现multi-label的问题,即labels可以是[[1,0,1,0], [1,0,0,0],[0,0,0,1]]这种同一个样本对应了一个或多个label的多分类问题。
1.2 softmax_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None, dim=-1, name=None)
不能解决multi-label的问题,只能是一个样本对应一个分类的多分类问题。
2 输入的labels是类别index的tensor的函数。
2.1 sparse_softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits(labels=None,logits=None, name=None)
和tf.nn.softmax_cross_entropy_with_logits的计算方式一致,结果也一样,只是入参的labels不同。
2.2 weighted_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits(labels, logits, pos_weight, name=None)
通过pos_weight对正样本计算tf.nn.sigmoid_cross_entropy_with_logits时候进行加权,即从原来的targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))变成了 targets * -log(sigmoid(logits)) * pos_weight +(1 - targets) * -log(1 - sigmoid(logits))
tf.nn.nce_loss的labels应该是index形式的,没有onehot