损失函数
损失函数
一般来说,监督学习的目标函数由损失函数和正则化项组成
损失函数在模型编译时候指定。对于回归模型,通常使用的损失函数是均方损失函数
对于多分类模型,如果
损失函数和正则化项
tf.keras.backend.clear_session()
model = models.Sequential()
model.add(layers.Dense(64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01),
kernel_constraint = constraints.MaxNorm(max_value=2, axis=0)))
model.add(layers.Dense(10,
kernel_regularizer=regularizers.l1_l2(0.01,0.01),activation = "sigmoid"))
model.compile(optimizer = "rmsprop",
loss = "binary_crossentropy",metrics = ["AUC"])
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 4160
_________________________________________________________________
dense_1 (Dense) (None, 10) 650
=================================================================
Total params: 4,810
Trainable params: 4,810
Non-trainable params: 0
_________________________________________________________________
内置损失函数
内置的损失函数一般有类的实现和函数的实现两种形式。如:
- mean_squared_error(均方误差损失,用于回归,简写为
mse, 类与函数实现形式分别为MeanSquaredError 和MSE ) mean_absolute_error ( 平均绝对值误差损失,用于回归,简写为mae, 类与函数实现形式分别为MeanAbsoluteError 和MAE) mean_absolute_percentage_error ( 平均百分比误差损失,用于回归,简写为mape, 类与函数实现形式分别为MeanAbsolutePercentageError 和MAPE) Huber(Huber 损失,只有类实现形式,用于回归,介于mse 和mae 之间,对异常值比较鲁棒,相对mse 有一定的优势) binary_crossentropy( 二元交叉熵,用于二分类,类实现形式为BinaryCrossentropy) categorical_crossentropy( 类别交叉熵,用于多分类,要求label 为onehot 编码,类实现形式为CategoricalCrossentropy) sparse_categorical_crossentropy( 稀疏类别交叉熵,用于多分类,要求label 为序号编码形式,类实现形式为SparseCategoricalCrossentropy) hinge( 合页损失函数,用于二分类,最著名的应用是作为支持向量机SVM 的损失函数,类实现形式为Hinge) kld( 相对熵损失,也叫KL 散度,常用于最大期望算法EM 的损失函数,两个概率分布差异的一种信息度量。类与函数实现形式分别为KLDivergence 或KLD) cosine_similarity( 余弦相似度,可用于多分类,类实现形式为CosineSimilarity)
自定义损失函数
自定义损失函数接收两个张量
下面是一个
它有两个可调参数,
$$ focal_loss(y,p) = \begin{cases} -\alpha (1-p)^{\gamma}\log(p) & \text{if y = 1}\ -(1-\alpha) p^{\gamma}\log(1-p) & \text{if y = 0} \end{cases} $$
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
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