Tensorflow中的损失函数LossFunction

Tensorflow中的损失函数loss

 

Tensorflow中的损失函数LossFunction_第1张图片

 


  • 回归问题
    • 均方根误差 MSE
      • 回归问题中最常用的损失函数
      • 优点:便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛
      • 缺点:受明显偏离正常范围的利群样本的影响较大
    • 平方绝对误差 MAE
      • 想格外增强对离群样本的健壮性时使用
      • 优点:克服MSE的缺点,受偏离正常范围的离群样本影响较小
      • 缺点:收敛速度比MSE慢,因为当误差大或小时都保持相同速度下降,在某一点还不可求导,计算机求导比较困难
    • Huber Loss
      • 集合MSE和MAE的优点,但是需要手动调参
      • 检测真实值和预测值之差的绝对值在超参数φ内时,使用MSE来计算loss,在φ外是使用类MAE计算。
      • sklearn中建议将 φ=1.35 以达到95%的有效性
  • 分类问题
    • sigmoid再求交叉熵
      • 二分类问题首选
      • 使用时不需要将预测值 y_pred 进行sigmoid处理,因为函数内部包含 sigmoid激活。
      • 真实值y_true 要求是One-hot编码形式
      • 球的结果是一组向量,是每个维度单独的交叉熵。求总的交叉熵,用reduce_sum求和即可。求loss则用reduce_mean进行平均
    • 交叉熵 log_loss
      • 预测值计算完成后,如果已经先进行了 sigmoid 处理,使用此函数求loss
    • softmax再求交叉熵
      • 多分类问题首选
      • 预测值是没有经过softmax处理的值,真实值要求是One-hot编码形式
    • 带权重的sigmoid交叉熵
      • 正负样本数量差距过大时
      • 增加权重系数,用来平衡正负样本差距。
    • 铰链损失 hinge_loss
      • SVM中使用
      • 求出不同类别间的“最大间隔”
      • 优点:小样本量就有不错的效果,对噪音包容性强
      • 缺点:样本量大时效率低,又是很难找到合适的区分方法
  • 自定义loss函数

"""
TensorFLow中的损失函数LossFunction汇总
参考:https://zhuanlan.zhihu.com/p/44216830
"""

import tensorflow as tf

y_true = tf.Variable()
y_pred = tf.Variable()

# ====== 1、回归问题 ======
# 1.1 均方根误差 MSE
# 使用tf集成的函数
mse = tf.losses.mean_squared_error(y_true,y_pred)
# 手工实现
mse1 = tf.reduce_mean(tf.square(y_true - y_pred))

# 1.2 平均绝对误差 MAE
maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_mean(maes)

# 1.3 Huber loss
hubers = tf.losses.huber_loss(y_true, y_pred)
hubers_loss = tf.reduce_mean(hubers)

# ====== 2、分类问题 ======
# 2.1 先 sigmoid 再交叉熵
# tf集成的函数
sigmoids = tf.nn.sigmoid_cross_entropy_with_logits(labels=y_true,logits=y_pred)
sigmoids_loss = tf.reduce_mean(sigmoids)
# 手工实现
y_pred_si = 1.0 / ( 1 + tf.exp(-y_pred) )
sigmoids1 = -y_true * tf.log(y_pred_si) - (1 - y_true) * tf.log(1 - y_pred_si)
sigmoids1_loss  = tf.reduce_mean(sigmoids1)

# 2.2 交叉熵
# tf集成的函数
logs = tf.losses.log_loss(labels=y_true,logits=y_pred)
logs_loss = tf.reduce_mean(logs)
# 手工实现
logs1 = -y_true * tf.log(y_pred) - (1-y_true) * tf.log(1 - y_pred)
logs_loss = tf.reduce_mean(logs)

# 2.3 先softmax再交叉熵
softmaxs = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_true,logits=y_pred)
softmaxs_loss = tf.reduce_mean(softmaxs)

# 2.4 如果2.3真实值不是One-hot形式,
softmaxs_spare = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true,logits=y_pred)
softmaxs_spare_loss = tf.reduce_mean(softmaxs_spare)

# 2.5 带权重的 sigmoid 交叉熵
# tf集成的函数
pos_weight = 0.5
sigmoid_weighted = tf.nn.weighted_cross_entropy_with_logits(targets=y_true,logits=y_pred,pos_weight=pos_weight)
sigmoid_weighted_loss = tf.reduce_mean(sigmoid_weighted)
# 手工实现
sigmoid_weighted1 = -y_true * tf.log(y_pred) * pos_weight - (1 - y_true) * tf.log(1 - y_pred)
sigmoid_weighted1_loss = tf.reduce_mean(sigmoid_weighted1)

# 2.6 铰链损失函数 hinge_loss
weights = 0.5
hings = tf.losses.hinge_loss(labels=y_true,logits=y_pred,weights=weights)
hings_loss = tf.reduce_mean(hings)

# ====== 3、自定义损失函数 ======
# 预测值比真实值大,用 (y_pred-y_true)*loss_more;反之,(y_true-y_pred)*loss_less
# loss = tf.reduce_sum(tf.where(tf.greater(y_pred, y_true), (y_pred-y_true)*loss_more,(y_true-y_pred)*loss_less))

 

你可能感兴趣的:(机器学习&深度学习,TensorFlow,LossFunction,损失函数)