关于keras 二分类情况下sigmoid与softmax激活函数以及binary_crossentropy与categorical_crossentropy损失函数的总结

最近在研究focal_loss时发现各种交叉熵损失函数写的形式都不一样,总结一下,以防以后使用.

首先sigmoid与softmax激活函数联系与区别:

sigmoid激活函数:
p ( x ) = 1 1 + e x p(x) = \frac{1}{1+e^x} p(x)=1+ex1
softmax激活函数:
p ( x i ) = e x i ∑ j = 1 n e x j p(x_i) =\frac{e^{x_i}}{\sum_{j=1}^ne^{x_j}} p(xi)=j=1nexjexi
在二分类情况下:
softmax激活函数为:
p ( x i ) = e x i e x j + e x i = 1 1 + e x i − x j p(x_i) =\frac{e^{x_i}}{e^{x_j}+e^{x_i}}=\frac{1}{1+e^{x_i-x_j}} p(xi)=exj+exexi1+exxj1
i i i j j j分别代表两类
i = 0 , j = 1 i=0,j=1 i=0,j=1
所以在二分类时,sigmoid和softmax在数学形式上是相等的.

binary_crossentropy与categorical_crossentropy

其中binary_crossentropy与sigmoid联合使用
而categorical_crossentropy与softmax联合使用
其中binary_crossentropy数学公式为
l o s s b i n a r y = − l a b e l ∗ l o g ( p r e d i c t ) − ( 1 − l a b e l ) ∗ l o g ( 1 − p r e d i c t ) loss_{binary}=-label*log(predict)-(1-label)*log(1-predict) lossbinary=labellog(predict)(1label)log(1predict)
而categorical_crossentropy的数学公式为
l o s s c a t e g o r i c a l = - ∑ i = 1 n l a b e l i ∗ l o g ( p r e d i c t ) loss_{categorical}=-\sum_{i=1}^nlabel_i*log(predict) losscategorical=i=1nlabelilog(predict)
在二分类时两者同样相同
在二分类时
当label=1时,
l o s s b i n a r y = − l o g ( p r e d i c t ) loss_{binary}=-log(predict) lossbinary=log(predict)
l o s s c a t e g o r i c a l = - l o g ( p r e d i c t 1 ) loss_{categorical}=-log(predict_1) losscategorical=log(predict1)
当label=0时,
l o s s b i n a r y = − l o g ( 1 - p r e d i c t ) loss_{binary}=-log(1-predict) lossbinary=log(1predict)
l o s s c a t e g o r i c a l = - l o g ( p r e d i c t 0 ) loss_{categorical}=-log(predict_0) losscategorical=log(predict0)
举例说明
比如label=1,在 s i g m o i d sigmoid sigmoid激活函数下预测结果为0.3,则损失函数为 l o s s b i n a r y = − l o g ( 0.3 ) loss_{binary}=-log(0.3) lossbinary=log(0.3)
s o f t m a x softmax softmax激活函数下预测结果onehot结果应该为[0.7,0.3],则损失函数为
l o s s c a t e g o r i c a l = - l o g ( 0.3 ) loss_{categorical}=-log(0.3) losscategorical=log(0.3)
二者完全相同
当lable=0时,在 s i g m o i d sigmoid sigmoid激活函数下预测结果为0.3,则损失函数为 l o s s b i n a r y = − l o g ( 1 - 0.3 ) loss_{binary}=-log(1-0.3) lossbinary=log(10.3)
s o f t m a x softmax softmax激活函数下预测结果应该为[0.7,0.3],则损失函数为
l o s s c a t e g o r i c a l = - l o g ( 0.7 ) loss_{categorical}=-log(0.7) losscategorical=log(0.7)
通过在keras中进行测试,发现代码结果确实相同:

import numpy as np
from keras.losses import categorical_crossentropy
from keras.losses import binary_crossentropy
import tensorflow as tf
import keras.backend as K
#设置label=1
label = np.array([[1,0]])
label = K.constant(label)
label_binary = np.array([[0]])
label_binary = K.constant(label_binary)
#预测结果
predict = np.array([[0.7,0.3]])
predict = K.constant(predict)
predict_binary = np.array([[0.3]])
predict_binary = K.constant(predict_binary)
#keras损失函数结果
#输出categorical_crossentropy结果
print(K.eval(categorical_crossentropy(label,predict)))
#结果为[0.35667497]
#输出binary_crossentropy结果
print(K.eval(binary_crossentropy(label_binary,predict_binary)))
#结果为[0.35667497]
#自定义binary_crossentropy
def binary_crossentropy(label,true):
    loss = -label*np.log(true)-(1-label)*np.log((1-true))
    return loss
label_binary = np.array([[0]])
predict_binary = np.array([[0.3]])
print(binary_crossentropy(label_binary,predict_binary))
#输出结果为0.35667497

#自定义categorical_loss
def categorical_loss(label,predict):
    loss = np.sum(-label*np.log(predict))
    return loss
print(categorical_loss(label,predict))
#结果为0.35667494393873245

总结:

1,在二分类情况下sigmoid和softmax是等价的.
2,在二分类情况下binary_crossentropy和categorical_crossentropy是相等的.

你可能感兴趣的:(文章,机器学习基础知识)