1 回答

TA贡献1842条经验 获得超13个赞
我对Tensorflow教程中最近的这种方式感到非常惊讶,在模型的最后一层()中使用线性激活函数来分类问题,然后在损失函数中要求。我想原因是它可能会导致更好的数字稳定性,如文档中所声称的那样:Dense(1)from_logits=True
from_logits:是否解释为对数值的张量。默认情况下,我们假设 包含概率(即 [0, 1] 中的值)。注意:使用可能数值更稳定。y_predy_predfrom_logits=True
其中 “by defaul” 表示此处损失函数参数的默认值为 。from_logits=False
无论如何,您最终得到了对logits的预测,而不是概率,就像迄今为止在类似教程(和实践中)中通常的情况一样。Logits的问题在于它们缺乏直观的解释,与概率预测相反。
你应该做的是从sigmoid函数传递你的logits,将它们转换为概率:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
前四个预测的示例:
preds = np.array([-1.7059733, -0.914219, 2.6422875, -0.50430596])
sigmoid(preds)
# array([0.15368673, 0.28613728, 0.93353404, 0.37652929])
然后将它们转换为阈值为0.5的“硬”预测:
final_preds = [1 if x>0.5 else 0 for x in preds]
final_preds
# [0, 0, 1, 0]
在这种形式下,你可以将它们与基本事实进行比较。
但是,为了避免这种情况,我建议您考虑将最后一层更改为
Dense(1, activation='sigmoid')
并从损失定义中删除该参数。这样,就应该返回硬预测(未测试)。(from_logits=True)model.predict
添加回答
举报