1 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
我對(duì)Tensorflow教程中最近的這種方式感到非常驚訝,在模型的最后一層()中使用線性激活函數(shù)來(lái)分類問(wèn)題,然后在損失函數(shù)中要求。我想原因是它可能會(huì)導(dǎo)致更好的數(shù)字穩(wěn)定性,如文檔中所聲稱的那樣:Dense(1)from_logits=True
from_logits:是否解釋為對(duì)數(shù)值的張量。默認(rèn)情況下,我們假設(shè) 包含概率(即 [0, 1] 中的值)。注意:使用可能數(shù)值更穩(wěn)定。y_predy_predfrom_logits=True
其中 “by defaul” 表示此處損失函數(shù)參數(shù)的默認(rèn)值為 。from_logits=False
無(wú)論如何,您最終得到了對(duì)logits的預(yù)測(cè),而不是概率,就像迄今為止在類似教程(和實(shí)踐中)中通常的情況一樣。Logits的問(wèn)題在于它們?nèi)狈χ庇^的解釋,與概率預(yù)測(cè)相反。
你應(yīng)該做的是從sigmoid函數(shù)傳遞你的logits,將它們轉(zhuǎn)換為概率:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
前四個(gè)預(yù)測(cè)的示例:
preds = np.array([-1.7059733, -0.914219, 2.6422875, -0.50430596])
sigmoid(preds)
# array([0.15368673, 0.28613728, 0.93353404, 0.37652929])
然后將它們轉(zhuǎn)換為閾值為0.5的“硬”預(yù)測(cè):
final_preds = [1 if x>0.5 else 0 for x in preds]
final_preds
# [0, 0, 1, 0]
在這種形式下,你可以將它們與基本事實(shí)進(jìn)行比較。
但是,為了避免這種情況,我建議您考慮將最后一層更改為
Dense(1, activation='sigmoid')
并從損失定義中刪除該參數(shù)。這樣,就應(yīng)該返回硬預(yù)測(cè)(未測(cè)試)。(from_logits=True)model.predict
添加回答
舉報(bào)