关于tensorflow交叉熵损失函数的一些理解

1、tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, dim=-1, name=None)

sentinel 一般不用  labels 和logits形状相同 都是[batch_size,num_classes]

其中labels可以是one-hot的形式,也可以是和为1的概率分布。例如[0.9,0.01,0.09]

本身这个函数就是计算两个概率分布之间的距离。

但是需要注意的是 logits并不是缩放后的和为1的概率分布,而是未经缩放的对数概率。

函数内部会进行两个操作:

(1)logits进行softmax操作

softmax的作用是对输入进来的的分数进行概率归一化 

也就是说,输进来n维的得分向量,输出n维的概率分布(和是1)这时候,概率分布的每一个数就代表了confidence,也就是属于该类的概率,或者说置信度。

(2)对得到的概率分布和labels的概率分布计算交叉熵


这个函数最后的输出是一个向量,如果我们想计算损失,就需要求平均值。

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, dim=-1, name=None))


tf.reduce_mean()用于计算tensor沿着某一个维度的均值,维度可自己设定

tf.reduce_sum()用于计算tensor沿着某一个维度的和,维度可自己设定

如果不指定维度,表示对所有元素进行此操作。


2、tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)

这里labels的形状是[batch_size],logits的形状是[batch_size,num_classes]

不需要再进行one-hot的转变 而是在函数内部完成。

需要注意的是 labels  必须从0开始编码 取值范围在[0,num_classes)

3、tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)

sigmoid_cross_entropy_with_logits是TensorFlow最早实现的交叉熵算法。这个函数的输入是logits和labels,logits就是神经网络模型中的 W * X矩阵,注意不需要经过sigmoid,而labels的shape和logits相同,就是正确的标签值,例如这个模型一次要判断100张图是否包含10种动物,这两个输入的shape都是[100, 10]。注释中还提到这10个分类之间是独立的、不要求是互斥,这种问题我们称为多目标(多标签)分类,例如判断图片中是否包含10种动物中的一种或几种,标签值可以包含多个1或0个1。

4、tf.nn.weighted_cross_entropy_with_logits(targets, logits, pos_weight, name=None)

weighted_sigmoid_cross_entropy_with_logits是sigmoid_cross_entropy_with_logits的拓展版,输入参数和实现和后者差不多,可以多支持一个pos_weight参数,目的是可以增加或者减小正样本在算Cross Entropy时的Loss。实现原理很简单,在传统基于sigmoid的交叉熵算法上,正样本算出的值乘以某个系数接口,算法实现如下。

猜你喜欢

转载自blog.csdn.net/zlrai5895/article/details/80382076
今日推荐