我正在嘗試用 3 個類訓練分類器 CNN。我正在嘗試對我的損失函式進行故障排除。我正在測驗tf.keras.losses.CategoricalCrossentropy()和tf.keras.losses.categorical_crossentropy().numpy(). 我正在遵循tensorflow 檔案中的獨立使用指南。
我認為我沒有得到應有的正確輸出。當我輸入時y_true=[0.,1.,0.],y_pred=[1.,0.,0.]我預計會損失無窮大(程式中的輸出:)nan。但是,我收到的輸出是16.118095. 當分類與標簽(即y_true=[1.,0.,0.]和y_pred=[1.,0.,0.])對齊時,輸出為1.192093e-07,即使我希望是完美的 0。
我真的對這種行為感到困惑。類似地,與1個長向量的情況下:y_true=[1.]和y_pred=[0.]損失16.118095,并且同樣地,當分類對準y_true=[1.]和y_pred=[1.]我接收1.192093e-07和y_true=[0.]和y_pred=[0.]結果nan。
我認為總結我得到的結果、我期望的結果以及我輸入到損失函式中的值會使事情更具可讀性,所以我將在下面這樣做:
y_true |
y_pred |
實際產量 | 我的期望 |
|---|---|---|---|
[0.,1.,0.] |
[1.,0.,0.] |
16.118095 | nan 或無窮大 |
[1.,0.,0.] |
[1.,0.,0.] |
1.192093e-07 | 真 0 |
[0.,1.] |
[1.,0.] |
16.118095 | nan 或無窮大 |
[1.,0.] |
[1.,0.] |
1.192093e-07 | 真 0 |
[1.] |
[0] |
nan 或無窮大 |
nan 或無窮大 |
[1.] |
[1.] |
1.192093e-07 | 真 0 |
如果這是一個微不足道的問題,我很抱歉,但我真的不知道為什么我會得到我得到的結果。我認為有些問題,因為我只得到 16 而不是無窮大,但如果沒有任何問題,我希望得到保證。如果我錯了,我真的很感激更正。
uj5u.com熱心網友回復:
原因是當它等于 1 或 0 時tf.keras.losses.categorical_crossentropy應用一個小的偏移量 ( 1e-7) y_pred,這就是為什么在你的情況下你看不到你期望的輸出。
import tensorflow as tf
def categorical_crossentropy(y_true, y_pred, clip=False):
if clip == True:
y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7)
return - tf.experimental.numpy.nansum(y_true * tf.math.log(y_pred))
y_true = [0., 1., 0.]
y_pred = [1., 0., 0.]
print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
# 16.118095
print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
# 16.118095
print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# inf
y_true = [1., 0., 0.]
y_pred = [1., 0., 0.]
print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
# 1.1920929e-07
print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
# 1.1920929e-07
print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# -0.0
y_true = [0., 1., 0.]
y_pred = [0.05, 0.95, 0.]
print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
# 0.051293306
print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
# 0.051293306
print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# 0.051293306
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391939.html
