Tensorflow 损失函数(loss function)及自定义损失函数(一)

我主要分三篇文章给大家介绍tensorflow的损失函数,本篇为tensorflow内置的四个损失函数

(一)tensorflow内置的四个损失函数
(二)其他损失函数
(三)自定义损失函数

损失函数(loss function),量化了分类器输出的结果(预测值)和我们期望的结果(标签)之间的差距,这和分类器结构本身同样重要。有很多的学者花费心思探讨如何改良损失函数使得分类器的结果最优,因此学会如何使用Tensorflow中的损失函数以及学会自己构建损失函数是非常重要的。

首先我们先规定一些变量这样方便大家之后更加清楚的读懂如何使用损失函数。

  1. Labels :标签,在分类或者分割等问题中的标准答案。可以是1,2,3,4,5,6 。
  2. Labels_onehot : Onehot形式的标签,即如果有3类那么第一类表示为[1,0,0],第二类为[0,1,0],第三类为[0,0,1]。这种形式的标签更加的常见。
  3. Network.out : 网络最后一层的输出,注意是没有经过softmax的网络的输出,通常是softmax函数的输入值。
  4. Network.probs : 网络输出的概率结果,通常为网络最后一层输出经过softmax函数之后的结果,Network.probs=tf.nn.softmax(Network.out)
  5. Network.pred : 网络的预测结果,在onehot的形式中选择概率最大的一类作为最终的预测结果,Network.pred=tf.argmax(Network.probs
    , axis=n)。
  6. Tensor : 一个张量,可以简单的理解为是tensorflow中的一个数组。
  7. tf.reduce_sum(Tensor) : 降维加和,比如一个数组是3*3*3大小的,那么经过这个操作之后会变为一个数字,即所有元素的加和。
  8. tf.reduce_mean(Tensor):降维平均,和上面的reduce_sum一样,将高维的数组变为一个数,该数是数组中所有元素的均值。

Tensorflow 内置的四个损失函数 ↓

下面我们就进入正题啦。Tf内置的损失函数一共有四个,弄懂了一个其余的就基本理解了,下面我们就逐一的介绍,其中第一个重点介绍,其余的建立在大家对第一个理解的基础之上。

  • ① Tensor=tf.nn.softmax_cross_entropy_with_logits(logits= Network.out, labels= Labels_onehot)

上面是softmax交叉熵loss,参数为网络最后一层的输出和onehot形式的标签。切记输入一定不要经过softmax,因为在函数中内置了softmax操作,如果再做就是重复使用了。在计算loss的时候,输出Tensor要加上tf.reduce_mean(Tensor)或者tf.reduce_sum(Tensor),作为tensorflow优化器(optimizer)的输入。

  • ② Tensor=tf.nn.sparse_softmax_cross_entropy_with_logits (logits=Network.out, labels= Labels)

这个函数和上面的区别就是labels参数应该是没有经过onehot的标签,其余的都是一样的。另外加了sparse的loss还有一个特性就是标签可以出现-1,如果标签是-1代表这个数据不再进行梯度回传。

  • ③ Tensor=tf.nn. sigmoid_cross_entropy_with_logits (logits= Network.out, labels= Labels_onehot)

sigmoid交叉熵loss,与softmax不同的是,该函数首先进行sigmoid操作之后计算交叉熵的损失函数,其余的特性与tf.nn.softmax_cross_entropy_with_logits一致。

  • ④Tensor=tf.nn.weighted_cross_entropy_with_logits (logits=Network.out, labels=Labels_onehot, pos_weight=decimal_number)

这个loss与众不同的地方就是加入了一个权重的系数,其余的地方与tf.nn. sigmoid_cross_entropy_with_logits这个损失函数是一致的,加入的pos_weight函数可以适当的增大或者缩小正样本的loss,可以一定程度上解决正负样本数量差距过大的问题。对比下面两个公式我们可以更加清晰的看到,他和sigmoid的损失函数的区别,对于普通的sigmoid来说计算的形式如下:

targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))

加入了pos_weight之后的计算形式如下:

targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))

猜你喜欢

转载自blog.csdn.net/limiyudianzi/article/details/80693695