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独热编码