我试图理解sigmoid_cross_entropy
损失函数在图像分割神经网络中的作用:
以下是相关的TensorFlow源代码:
zeros = array_ops.zeros_like(logits, dtype=logits.dtype)cond = (logits >= zeros)relu_logits = array_ops.where(cond, logits, zeros)neg_abs_logits = array_ops.where(cond, -logits, logits)return math_ops.add( relu_logits - logits * labels, math_ops.log1p(math_ops.exp(neg_abs_logits)), name=name)
我的主要问题是为什么在返回时使用了math_ops.add()
?这个加法是指对图像中每个像素的损失求和,还是加法在做其他事情?我无法正确跟踪维度的变化来推断加法在做什么。
回答:
sigmoid_cross_entropy_with_logits
用于多标签分类。
整个问题可以分解为对独立类别预测的二元交叉熵损失(例如,1既是偶数又是质数)。最后收集所有预测损失并对其进行平均。
下面是一个例子:
import tensorflow as tflogits = tf.constant([[0, 1], [1, 1], [2, -4]], dtype=tf.float32)y_true = tf.constant([[1, 1], [1, 0], [1, 0]], dtype=tf.float32)# tensorflow apiloss = tf.losses.sigmoid_cross_entropy(multi_class_labels=y_true, logits=logits)# manul computingprobs = tf.nn.sigmoid(logits)loss_t = tf.reduce_mean(y_true * (-tf.log(probs)) + (1 - y_true) * (-tf.log(1 - probs)))config = tf.ConfigProto()config.gpu_options.allow_growth = True # pylint: disable=no-memberwith tf.Session(config=config) as sess: loss_ = loss.eval() loss_t_ = loss_t.eval() print('sigmoid_cross_entropy: {: .3f}\nmanual computing: {: .3f}'.format( loss_, loss_t_))------------------------------------------------------------------------------#output: sigmoid_cross_entropy: 0.463 manual computing: 0.463