语义分割 Loss 为负如何破

语义分割 Loss 为负如何破


语义分割特别是在二分类中, 有可能出现 Loss 为负的情况, 为什么为这样呢? 我们先来看一下 Binary Cross Entropy 的公式

L o s s = − 1 n ∑ [ y i ∗ l n ( p i ) ) + ( 1 − y i ) ∗ l n ( 1 − p i ) ] Loss = - \frac{1}{n} \sum [y_i * ln(p_i)) + (1 - y_i) * ln(1-p_i)] Loss=n1[yiln(pi))+(1yi)ln(1pi)]
其中 y i y_i yi 是标签值, p i p_i pi 是预测值

因为二分类最后输出用的是 sigmoid 激活函数, 所以 p i p_i pi 范围是 0~1, 所以 l n ( p i ) ≤ 0 ln(p_i) \leq 0 ln(pi)0, l n ( 1 − p i ) ≤ 0 ln(1-p_i) \leq 0 ln(1pi)0, 可以推出 y i ∗ l n ( p i ) ≤ 0 y_i * ln(p_i) \leq 0 yiln(pi)0

接下来还剩 ( 1 − y i ) ∗ l n ( 1 − p i ) (1 - y_i) * ln(1-p_i) (1yi)ln(1pi) 是正还是负呢? 如果 p i p_i pi预测为 1, 用 0.99 这样的会比较能说明问题一点, 当 p i = 0.99 p_i = 0.99 pi=0.99 时有
C = y i ∗ l n ( 0.99 ) + ( 1 − y i ) ∗ l n ( 1 − 0.99 ) = y i ∗ l n ( 0.99 ) + ( 1 − y i ) ∗ l n ( 0.01 ) C = y_i * ln(0.99) + (1 - y_i) * ln(1 - 0.99) = y_i * ln(0.99) + (1 - y_i) * ln(0.01) C=yiln(0.99)+(1yi)ln(10.99)=yiln(0.99)+(1yi)ln(0.01)
l n ( 0.99 ) ≈ − 0.01 ln(0.99) \approx -0.01 ln(0.99)0.01
l n ( 0.01 ) ≈ − 4.61 ln(0.01) \approx -4.61 ln(0.01)4.61
现在上面的式子变成:
C = − 0.01 ∗ y i − 4.61 ∗ ( 1 − y i ) C = -0.01 * y_i - 4.61 * (1 - y_i) C=0.01yi4.61(1yi)
现在要使 C 为正才能使 Loss 小于 0. 现在看出来问题在哪里了吗?

正常情况下, y i = 0 y_i = 0 yi=0 y i = 1 y_i = 1 yi=1. 但当 y i y_i yi 大于 1 时, 问题就来了, 那什么情况下 y i y_i yi 会大于 1 呢? 标签图像处理错误时. 所以查看你的代码, 标签处理后的值是不是大于1, 特别是索引图像的处理

如何正确生成标签和读入, 可以看下面文章
语义分割之 标签生成
语义分割之 加载训练数据

你可能感兴趣的:(Semantic,Segmentation,深度学习,Tensorflow,语义分割)