ank*_*nia 1 python loss tensorflow cross-entropy pytorch
我尝试过使用 Tensorflow 和 Pytorch CrossEntropyLoss 但它返回不同的值,我不知道为什么。请找到下面的代码和结果。感谢您的投入和帮助。
import tensorflow as tf
import numpy as np
y_true = [3, 3, 1]
y_pred = [
[0.3377, 0.4867, 0.8842, 0.0854, 0.2147],
[0.4853, 0.0468, 0.6769, 0.5482, 0.1570],
[0.0976, 0.9899, 0.6903, 0.0828, 0.0647]
]
scce3 = tf.keras.losses.SparseCategoricalCrossentropy(reduction=tf.keras.losses.Reduction.AUTO)
loss3 = scce3(y_true, y_pred).numpy()
print(loss3)
Run Code Online (Sandbox Code Playgroud)
上面的结果是:1.69
火炬损失:
from torch import nn
import torch
loss = nn.CrossEntropyLoss()
y_true = torch.Tensor([3, 3, 1]).long()
y_pred = torch.Tensor([
[0.3377, 0.4867, 0.8842, 0.0854, 0.2147],
[0.4853, 0.0468, 0.6769, 0.5482, 0.1570],
[0.0976, 0.9899, 0.6903, 0.0828, 0.0647]
])
loss2 = loss(y_pred, y_true)
print(loss2)
Run Code Online (Sandbox Code Playgroud)
上述损失值为:1.5
Tensorflow 的 CrossEntropy 期望概率作为输入(即操作后的值tf.nn.softmax),而 PyTorch 的 CrossEntropyLoss 期望原始输入,或更常见的名称为 logits。如果使用 softmax 运算,这些值应该相同:
import tensorflow as tf
import numpy as np
y_true = [3, 3, 1]
y_pred = [
[0.3377, 0.4867, 0.8842, 0.0854, 0.2147],
[0.4853, 0.0468, 0.6769, 0.5482, 0.1570],
[0.0976, 0.9899, 0.6903, 0.0828, 0.0647]
]
scce3 = tf.keras.losses.SparseCategoricalCrossentropy(reduction=tf.keras.losses.Reduction.AUTO)
loss3 = scce3(y_true, tf.nn.softmax(y_pred)).numpy()
print(loss3)
>>> 1.5067214
Run Code Online (Sandbox Code Playgroud)
from torch import nn
import torch
loss = nn.CrossEntropyLoss()
y_true = torch.Tensor([3, 3, 1]).long()
y_pred = torch.Tensor([
[0.3377, 0.4867, 0.8842, 0.0854, 0.2147],
[0.4853, 0.0468, 0.6769, 0.5482, 0.1570],
[0.0976, 0.9899, 0.6903, 0.0828, 0.0647]
])
loss2 = loss(y_pred, y_true)
print(loss2)
>>> tensor(1.5067)
Run Code Online (Sandbox Code Playgroud)
由于LogSumExp技巧可保证数值稳定性,因此通常建议使用原始输入 (logits)。如果您使用 Tensorflow,我建议使用该tf.nn.softmax_cross_entropy_with_logits函数或其稀疏对应函数。编辑:该类SparseCategoricalCrossentropy还有一个关键字参数from_logits=False,可以设置True为达到相同的效果。
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |