Tensorlfow2.0 Focal Loss 理解
Focal Loss
前言
是这样的,目前手头上需要做正负样本不平衡的二分类,所以找了一圈还是对损失函数下手,只说tensorflow2.0 版本。
不平衡数据分类
在tensorflow的.fit方法里,藏了一个class_weight的参数,入参就是一个分类比例字典,但我是自定义的训练方式,找了半天没找到合适的加权二分类,只能自己写一个损失函数。
交叉熵
交叉熵就是预测分类的概率,如果是二分类,就是0~1的小数,也就是代表多大概率是正样本,所以二分类最后一层可以输出一个经过sigmod激活的小数。
比如下面的一个例子,真实分类是0或者1,经过网络出来的结构就是为1的概率。
# 自己编数据
t = [1, 0, 1, 0, 1]
p = [0.9, 0.3, 0.8, 0.2, 0.4]
# 损失函数出来数值
tf.keras.losses.BinaryCrossentropy()(t, p)
# 结果
<tf.Tensor: shape=(), dtype=float32, numpy=0.3649225>
公式如下
−
1
n
∑
y
i
∗
l
o
g
p
^
i
+
(
1
−
y
i
)
∗
l
o
g
(
1
−
p
^
i
)
-\frac{1}{n}\sum {y_i*log\widehat{p}_i+(1-y_i)*log(1-\widehat{p}_i)}
−n1∑yi∗logp
i+(1−yi)∗log(1−p
i)
其中
y
i
y_i
yi是真实值,
p
^
i
\widehat{p}_i
p
i是预测概率,只不过在二分类中
y
i
y_i
yi的概率取值只有两个100%和0,也就是1和0。式子进一步简化为
L
c
e
(
y
,
p
^
)
=
{
−
l
o
g
p
^
if
y
=
1
−
l
o
g
(
1
−
p
^
)
if
y
=
0
L_{ce}(y,\widehat{p} )=\begin{cases} -log\widehat{p}& \text{ if } y= 1\\ -log(1-\widehat{p}) & \text{ if } y= 0 \end{cases}
Lce(y,p
)={−logp
−log(1−p
) if y=1 if y=0
Focal Loss
如果碰见正负样本比例差很多的怎么办,比如1000个数据,只有10个是正样本,剩下都是负样本。即便我都预测成负样本准确率也蛮高的,但是这样的模型不行。
想一个办法,让负样本的贡献小点,让正样本的贡献大点,那就是加权了,Facal Loss它是这样加的。
L f l = { − ( 1 − p ^ ) γ l o g p ^ if y = 1 − p ^ γ l o g ( 1 − p ^ ) if y = 0 L_{fl}=\begin{cases} -(1-\widehat{p})^\gamma log\widehat{p} & \text{ if } y= 1\\ -\widehat{p}^\gamma log(1-\widehat{p}) & \text{ if } y= 0 \end{cases} Lfl={−(1−p )γlogp −p γlog(1−p ) if y=1 if y=0
代码tensorflow里代码早就有了
# Example 1: (batch_size = 1, number of samples = 4)
y_true = [0, 1, 0, 0]
y_pred = [-18.6, 0.51, 2.94, -12.8]
loss = tf.keras.losses.BinaryFocalCrossentropy(gamma=2,
from_logits=True)
loss(y_true, y_pred).numpy()
本文来自博客园,作者:赫凯,转载请注明原文链接:https://www.cnblogs.com/heKaiii/p/17137372.html

浙公网安备 33010602011771号