我试图了解sigmoid_cross_entropy
损失函数对图像分割神经网络的作用:
以下是相关的Tensorflow来源code:
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()
?加法是指图像中每个像素的损失总和,还是总和有所不同?我无法正确地遵循尺寸变化来推断总和。
答案 0 :(得分:2)
在这种情况下,math_ops.add()
对应于tf.add(x,y),它只是将两个相同大小的张量相加在一起,结果的尺寸与参数相同。
将sigmoid_cross_entropy_with_logits
用于细分任务时,您应该执行以下操作:
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=predictions)
其中labels
是每个像素的标签的展平张量,logits
是每个像素的预测的展平张量。
它返回loss
,一个包含每个像素的单个损失的张量。然后,您可以使用
loss_mean = tf.reduce_mean(loss)
对所有单个像素的损耗求平均以得出最终损耗。
答案 1 :(得分:1)
sigmoid_cross_entropy_with_logits
用于多标签分类。
对于独立的类别预测,整个问题可以分为二元交叉熵损失(例如1既是偶数又是素数)。最终收集所有预测损失并将其平均。
下面是一个示例:
import tensorflow as tf
logits = 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 api
loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=y_true,
logits=logits)
# manul computing
probs = 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-member
with 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