標籤平滑的原理

2021-10-09 22:38:46 字數 3047 閱讀 8292

在tensorflow2.x版本中呼叫該函式,請看:

基於 keras 和 tensorflow 的標籤平滑實現.

假設選用softmax交叉熵訓練乙個三分類模型,某樣本經過網路最後一層的輸出為向量x=(1.0, 5.0, 4.0),對x進行softmax轉換輸出為:

假設該樣本y=[0, 1, 0],那損失loss:

按softmax交叉熵優化時,針對這個樣本而言,會讓0.721越來越接近於1,因為這樣會減少loss,但是這有可能造成過擬合。可以這樣理解,如果0.721已經接近於1了,那麼網路會對該樣本十分「關注」,也就是過擬合。我們可以通過標籤平滑的方式解決。

以下是**中對此問題的闡述:

假設有一批資料在神經網路最後一層的輸出值和他們的真實標籤

out = np.array([[4.0, 5.0, 10.0], [1.0, 5.0, 4.0], [1.0, 15.0, 4.0]])

y = np.array([[0, 0, 1], [0, 1, 0], [0, 1, 0]])

直接計算softmax交叉熵損失:

res = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=0)

print(tf.session().run(res))

結果為:0.11191821843385696

使用標籤平滑後:

res2 = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=0.001)

print(tf.session().run(res2))

結果為:0.11647378653287888

可以看出,損失比之前增加了,他的標籤平滑的原理是對真實標籤做了改變,原始碼裡的公式為:

new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes

new_onehot_labels = y * (1 - 0.001) + 0.001 / 3

print(y)

print(new_onehot_labels)

[[0 0 1]

[0 1 0]

[0 1 0]]

[[3.33333333e-04 3.33333333e-04 9.99333333e-01]

[3.33333333e-04 9.99333333e-01 3.33333333e-04]

[3.33333333e-04 9.99333333e-01 3.33333333e-04]]

然後使用平滑標籤計算softmax交叉熵就能得到最終的結果了,我們也可以驗證一下:

res3 = tf.losses.softmax_cross_entropy(onehot_labels=new_onehot_labels, logits=out, label_smoothing=0)

print(tf.session().run(res3))

結果為:0.11647378653287888

該過程的**片:

下面展示一些內聯**片

# 採用的是tensorflow1.x版本的形式

import numpy as np

import tensorflow as tf

out = np.array([[

4.0,

5.0,

10.0],

[1.0

,5.0

,4.0],

[1.0

,15.0

,4.0]]

)y = np.array([[

0,0,

1],[

0,1,

0],[

0,1,

0]])

res = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=0)

print

(tf.session(

).run(res)

)res2 = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=

0.001

)print

(tf.session(

).run(res2)

)# new_onehot_labels = onehot_labels * (1 - label_smoothing)

# + label_smoothing / num_classes

new_onehot_labels = y *(1

-0.001)+

0.001/3

print

(y)print

(new_onehot_labels)

res3 = tf.losses.softmax_cross_entropy(onehot_labels=new_onehot_labels, logits=out, label_smoothing=0)

print

(tf.session(

).run(res3)

)

rethinking the inception architecture for computer vision

標籤平滑(label smoothing)——分類問題中錯誤標註的一種解決方法.

深度學習 標籤平滑

標籤平滑採用如下思路解決這個問題 在訓練時即假設標籤可能存在錯誤,避免 過分 相信訓練樣本的標籤,也就避免了過擬合。具體例項如下 1 假設某個三分類問題,最終的 輸出為 1.5.4.經過softmax函式之後,就可以得到 2 假設該樣本的初始label為 0,1,0 則對應的損失函式,使用交叉熵計算...

workerman平滑重啟原理

平滑重啟不同於普通的重啟,平滑重啟可以做到在不影響使用者的情況下重啟服務,以便重新載入php程式,完成業務 更新。平滑重啟一般應用於業務更新或者版本發布過程中,能夠避免因為 發布重啟服務導致的暫時性服務不可用的影響。注意 只有子程序執行過程中載入的檔案支援reload,主程序載入的檔案不支援relo...

卷積平滑資料原理 有邊緣效應

一 離散卷積的求法 假設兩組資料 a 原始資料 a b c d b 平滑視窗 1 2 1 3 則a卷積b等於 1 a 1 2 a 2 b 2 c 2 d 2 空 不移位 2 a 1 3 空 a 3 b 3 c 3 d 3 向右移一位 3 1 2 a 2 b 2 a 3 c 2 b 3 d 2 c 3...