1.常用损失函数
tf.keras.losses
列举常用的,如下:
BinaryCrossentropy和binary_crossentropy有什么区别?
前者是类的实现形式,后者是函数的实现形式
这两者并没有本质的区别
使用损失函数时,首先要确定到底是分类还是回归问题?一定要对应
每个损失函数是如何实现的一定要清楚
交叉熵损失函数-多分类
# tf版本
import tensorflow as tf
# 调用类,输入损失函数
cce = tf.keras.losses.CategoricalCrossentropy()
loss = cce(
[[1.,0.,0.],[0.,1.,0.],[0.,0.,1.]],
[[.9,.05,.05],[.05,.89,.06],[.05,.01,.94]])
print('Loss:',loss.numpy()) # Loss: 0.09458993
# Numpy版本
import numpy as np
a = np.array([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.]])
b = np.array([[.9,.05,.05],[.05,.89,.06],[.05,.01,.94]])
np.average(-np.sum(a * np.log(b),axis=1)) # 0.09458991187728844
2.自定义损失函数
mse
Focal loss损失函数
多分类的Focal loss函数:
gamma 用来减小易分类样本的权重,使得模型训练时更加专注于难分类的样本
α 用来计算每个类别的概率-权重-二分类变成多分类时,α会失效
# 类的实现
class SparseFocalLoss(tf.keras.losses.Loss):
def __init__(self,gamma=2.0,alpha=0.25,class_num=10):
# 初始化参数
self.gamma = gamma
self.alpha = alpha
self.class_num = class_num
super(SparseFocalLoss,self).__init__()
def call(self,y_true,y_pred):
# 激活函数
y_pred = tf.nn.softmax(y_pred,axis=-1)
# 使预测值在某个区间不为0
epsilon = tf.keras.backend.epsilon()
y_pred = tf.clip_by_value(y_pred,epsilon,1.0)
# 转换成one_hot格式
y_true = tf.one_hot(y_true,depth=self.class_num)
# 数据类型转化
y_true = tf.cast(y_true,tf.float32)
loss = -y_true * tf