Tensorlfow2.0 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)} n1yilogp i+(1yi)log(1p 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(1p ) 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={(1p )γlogp p γlog(1p ) 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()

posted @ 2022-10-14 16:50  赫凯  阅读(118)  评论(0)    收藏  举报