TF.Losses 损失函数
一、损失函数
损失函数是算法流程正向传播的最终传播结果。
让模型有更优的预测结果,就是选择合适的可以缩小预测值与计算值之间的差距,这个差距整体的缩小,是通过损失函数来衡量的。
损失函数,也是反向传播的开始,将计算的结果对正向传播参数进行一系列求导后,借助梯度更新参数,达到参数变化->减少损失值->提升准确率的。
常见的损失函数有:
- 【分类模型】交叉熵函数
- 【连续模型】均方差函数
损失函数的输入,一般是两个值,y_true, y_predicted, 即真实值和预测值
二、TF2中的损失函数
每种损失函数,均有类形式和函数形式,使用的时候,均需输入y_true
, y_predicted
.
调用方法均为:tf.keras.losses.xxx
1、MeanSquaredError 均方误差损失函数
应用:回归
other_class: MSE
method: mean_squared_error
2、MeanAbsolutePercentageError 平均百分比误差损失函数
应用:回归
other_class: MAPE
method: mean_absolute_percentage_error
3、MeanAbsoluteError 平均绝对值误差损失函数
应用:回归
other_class: MAE
method: mean_absolute_error
4、Huber huber损失函数
该函数只有类实现形式,用于回归,介于mse与mae之间,对异常值比较鲁棒,相对mse有一定的优势。
5、BinaryCrossentropy 二元交叉熵
应用:二分类
method: binary_crossentropy
6、CategoricalCrossentropy 类别交叉熵
应用:多分类,要求label为序号编码形式,即y_true为从0开始的int型
这个函数其实是就是连接softmax层的。
method: categorical_crossentropy
7、SparseCategoricalCrossentropy 稀疏类别交叉熵
应用:多分类,要求label为序号编码形式,用于处理softmax之前的稀疏矩阵
method : sparse_categorical_crossentropy
8、Hinge 合页损失函数
应用:二分类,作为支持向量机SVM的损失函数
method: hinge
9、KLDivergence 相对熵损失函数
别称:KL散度
应用:常用于最大期望算法EM的损失函数,两个概率分布差异的以重信息度量
method: KLD
10、CosineSimilarity 余弦相似度
应用:多分类
method: cosine_similarity
三、自定义损失函数
自定义损失函数的输入为:y_true, y_pred两个张量, 输出为一个标量作为损失函数值。
自定义损失类继承tf.keras.losses.Loss,重写call方法实现损失的计算逻辑。
自定义损失函数,只需要将损失逻辑写到函数内部即可。
方法实现:
def focal_loss(gamma=2., alpha=0.75):
def focal_loss_fixed(y_true, y_pred):
bce = tf.losses.binary_crossentropy(y_true, y_pred)
p_t = (y_true * y_pred) + ((1 - y_true) * (1 - y_pred))
alpha_factor = y_true * alpha + (1 - y_true) * (1 - alpha)
modulating_factor = tf.pow(1.0 - p_t, gamma)
loss = tf.reduce_sum(alpha_factor * modulating_factor * bce,axis = -1 )
return loss
return focal_loss_fixed
使用:focal_loss()(y_true, y_pred)
类实现:
class FocalLoss(tf.keras.losses.Loss):
def __init__(self,gamma=2.0,alpha=0.75,name = "focal_loss"):
self.gamma = gamma
self.alpha = alpha
def call(self,y_true,y_pred):
bce = tf.losses.binary_crossentropy(y_true, y_pred)
p_t = (y_true * y_pred) + ((1 - y_true) * (1 - y_pred))
alpha_factor = y_true * self.alpha + (1 - y_true) * (1 - self.alpha)
modulating_factor = tf.pow(1.0 - p_t, self.gamma)
loss = tf.reduce_sum(alpha_factor * modulating_factor * bce,axis = -1 )
return loss