Tensorflow中的損失函數LossFunction

Tensorflow中的損失函數loss

 

 


  • 迴歸問題
    • 均方根誤差 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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章