Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python from_logits=真,但损失为0_Python_Tensorflow - Fatal编程技术网

Python from_logits=真,但损失为0

Python from_logits=真,但损失为0,python,tensorflow,Python,Tensorflow,我正在学习tensorflow,希望将tensorflow的实现与数学联系起来 据我所知,数学交叉熵要求其输入之和为1。在以下代码中,y\u true是有效输入,而y\u pred不是数学上有效的输入: y_true = [[0, 1]] y_pred = [[1.0, 20.0]] print(tf.keras.losses.CategoricalCrossentropy(from_logits=False).call(y_true, y_pred)) print(tf.keras.losse

我正在学习tensorflow,希望将tensorflow的实现与数学联系起来

据我所知,数学交叉熵要求其输入之和为1。在以下代码中,
y\u true
是有效输入,而
y\u pred
不是数学上有效的输入:

y_true = [[0, 1]]
y_pred = [[1.0, 20.0]]
print(tf.keras.losses.CategoricalCrossentropy(from_logits=False).call(y_true, y_pred))
print(tf.keras.losses.CategoricalCrossentropy(from_logits=True).call(y_true, y_pred))
给出:

tf.Tensor([0.04879016],shape=(1,),dtype=float32)
tf.张量([0.],shape=(1,),dtype=float32)
请找出要点

说:

如果from_logits=False,则表示输入为概率

说:

from_logits=True
表示交叉熵层的输入正常 张量/对数

说:

“在上述代码中,
raw\u predictions
的另一个名称是
logit

我猜,来自logits的
意味着输入是
原始预测

因为我的输入不是概率,所以我从_logits=True设置了
,但得到的结果是0


有人能解释一下吗?

标签
[[0,1]]
和logits
[[1,20]]
之间的交叉熵应该是一个非常接近于0的值(由于浮点不精确,一些输出可能表示为零)。以概率表示,这些logits大约是
[[0.000000005,1]]
。注意这些概率与标签的距离有多近。因此交叉熵应该非常低

正如OP在他们的问题中指出的那样,当对未标度的输出进行操作时,应该使用
from_logits=True
。实际上,如果在softmax之前对输出进行操作,则使用
from_logits=True
。softmax将未标度的输出映射为概率。要计算这些概率的交叉熵,请使用
from_logits=False
s应该使用

以下是一个例子:

将tensorflow导入为tf
y_true=tf。将_转换为_张量([[0,1]],“float32”)
y_pred=tf。将_转换为_张量([[1,20]],“float32”)
ce_logits_fn=tf.keras.loss.CategoricalCrossentropy(from_logits=True)
ce_probs_fn=tf.keras.loss.CategoricalCrossentropy(from_logits=False)
打印(ce_logits_fn(y_true,y_pred))
#tf.张量(0.0,shape=(),dtype=float32)
打印(ce_probs_fn(y_true,tf.nn.softmax(y_pred)))
#tf.张量(1.1920929e-07,形状=(),数据类型=浮点32)
在上面的例子中,正确类的值要比错误类的值高得多,所以交叉熵很低

将tensorflow导入为tf
y_true=tf。将_转换为_张量([[0,1]],“float32”)
y_pred=tf。将_转换为_张量([[5,7]],“float32”)
ce_logits_fn=tf.keras.loss.CategoricalCrossentropy(from_logits=True)
ce_probs_fn=tf.keras.loss.CategoricalCrossentropy(from_logits=False)
打印(ce_logits_fn(y_true,y_pred))
#tf.张量(0.12692805,shape=(),dtype=float32)
打印(ce_probs_fn(y_true,tf.nn.softmax(y_pred)))
#tf.张量(0.126928,shape=(),dtype=float32)

这澄清了很多,谢谢!我发现
ce\u logits\u fn(y\u true,tf.nn.softmax(y\u pred))
输出了一个不同的结果。我猜softmax的softmax不是幂等的。如果输入恰好像[0.1,0.9]我是否应该检查每个输入,如果任何输入看起来不像概率,我假设输入没有通过softmax?好吧,我真正关心的是,总是从_logits=True
打开
是否可以?如果我的模型已经有softmax层,那么保持
从_logits=True
是否会影响t培训?因为您的模型给出了概率,所以您应该使用
from\u logits=False
。更新版本(不确定从何时开始)of
tf.keras
将隐含。有趣的一点是概率的softmax不会返回相同的值……我很想知道为什么。如果你在概率上使用
from_logits=True
,那么你的损失将是错误的,你的模型将无法正确学习。