交叉熵损失函数的总结

文章目录

  • sigmoid交叉熵
  • 二值交叉熵损失
    • 小结
  • 稀疏softmax交叉熵
  • 分类交叉熵

sigmoid交叉熵

  • 具体地,在离散分类任务中衡量概率分布的误差,输出层不需要使用激活函数。特别地注意:用来处理每个类别独立但不互斥的情况
  • tf.nn.sigmoid_cross_entropy(labels=None,logits=None,name=None)
    这里的logits参数表示未经过概率处理的值。
  • 返回的shape=(labels,)表示输出层每一个单元(每一个类别)都计算了一次交叉熵,通常结合tf.reduce_sum和tf.reduce_mean来使用,前者用来求每一个样本的loss,后者用来求一次Batch的loss。
  • 计算公式为:(这里考虑的数据溢出的问题)
    在这里插入图片描述

二值交叉熵损失

  • tf.keras.losses.BinaryCrossEntropy(from_logits=False),参数from_logits意思是输出层如果没有激活函数,则为True,表示接收到了原始的logits;为False表示输出层经过了概率处理。
  • 基本上和sigmoid交叉熵损失等价,只是计算方式不同
  • 该函数返回一个real num,用于labels值有两种的情况(可以是{0,1},也可以是其他)。返回的loss是基于batch_size的求和,是因为内部使用了reduction = ‘AUTO’,即SUM_OVER_BATCH_SIZE,所以最后出来的shape应该为(batch_size,),之后我们可以使用tf.reduce_mean()来求样本loss的平均,当然也可以不求。
  • 下面两部分代码等价
# 使用tf.nn.sigmoid_cross_entropy_with_logits
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels,logits)
loss = tf.reduce_sum(loss,axis=[除了batch_size,都写上])
loss = tf.reduce_mean(loss)

# 使用tf.keras.losses.BinaryCrossEntropy(from_logits=True)

cross_entropy = tf.keras.losses.BinaryCrossEntropy(from_logits=True)# 先构建一个交叉熵对象
loss = cross_entropy(labels,logits) # (batch_size,) 'SUM_OVER_BATCH_SIZE'
loss = tf.reduce_mean(loss)

在图像重构时,可以把每个像素看成是一个类别,它们独立但不互斥,所以不能用softmax再最后一层,只能用sigmoid交叉熵或者二值交叉熵作为loss

小结

  • 带logits的sigmoid交叉熵计算的是每一个对用维度上对应元素的损失值,它是多目标的二分类或多酚类问题
  • 带logits的softmax交叉熵与其区别在于:后者给出的是每一个维度上的损失,前者给出的是整体的损失,是单目标的二分类或多分类问题
  • 函数传入的logits是unscaled的,既不做sigmoid也不做softmax,在函数内部会更加高效的利用logits(防止数据溢出的问题)

稀疏softmax交叉熵

  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • 它与 tf.nn.softmax_cross_entropy_with_logits唯一的区别就是非稀疏要求传入的labels是要经过one_hot编码的,而稀疏的不需要。

分类交叉熵

  • tf.keras,losses.CategoricalCrossentropy(from_logits)
  • 与tf.nn.softmax_cross_entropy_with_logits相似,y_output为one_hot独热编码

你可能感兴趣的:(tensorflow学习)