python - 自定义损失函数结果与内置损失函数结果不匹配

标签 python tensorflow machine-learning

我在 tensorflow 中实现了自定义二元交叉熵损失函数。为了测试这一点,我将它与 Tensorflow 中内置的二元交叉熵损失函数进行了比较。但是,在这两种情况下我得到的结果截然不同。我无法理解这种行为。

def custom_loss(eps,w1,w2):
    def loss(y_true, y_pred):
        ans = -1*(w1*y_true*tf.log(y_pred+eps) + w2*(1-y_true)*tf.log(y_pred+eps))
        return ans
    return loss

我已将 eps 设置为 1e-6,w1=1 和 w2=1。当我使用我的损失函数实现时,损失下降到非常小的值。然而,使用 tensorflow 中的内置损失函数时,出现稳步下降。

编辑: 以下是输出:

1:使用自定义实现:

1/650 [................................] - ETA:46:37 - 损失:0.8810 - acc : 0.50

2/650 [................................] - ETA:41:27 - 损失:0.4405 - acc : 0.40

3/650 [................................] - 预计到达时间:39:38 - 损失:0.2937 - acc :0.41

4/650 [................................] - 预计到达时间:38:44 - 损失:0.2203 - acc : 0.45

5/650 [................................] - ETA:38:13 - 损失:0.1762 - acc : 0.46

6/650 [................................] - 预计到达时间:37:47 - 损失:0.1468 - acc : 0.42

7/650 [................................] - 预计到达时间:37:29 - 损失:0.1259 - acc : 0

  1. 使用 eps=1e-7 的内置损失函数。

1/650 [................................] - 预计到达时间:48:15 - 损失:2.4260 - acc : 0.31

2/650 [................................] - 预计到达时间:42:09 - 损失:3.1842 - acc : 0.46

3/650 [................................] - 预计到达时间:40:10 - 损失:3.4615 - acc :0.47

4/650 [................................] - 预计到达时间:39:06 - 损失:3.9737 - acc : 0.45

5/650 [................................] - 预计到达时间:38:28 - 损失:4.5173 - acc :0.47

6/650 [................................] - 预计到达时间:37:58 - 损失:5.1865 - acc : 0.45

7/650 [................................] - 预计到达时间:37:41 - 损失:5.8239 - acc : 0.43

8/650 [................................] - 预计到达时间:37:24 - 损失:5.6979 - acc : 0.46

9/650 [................................] - 预计到达时间:37:12 - 损失:5.5973 - acc : 0.47

输入是来自 MURA 数据集的图像。为了保持测试统一,相同的图像在两个测试中都通过了。

最佳答案

您的实现存在轻微错误。

你有:

ans = -1*(w1*y_true*tf.log(y_pred+eps) + w2*(1-y_true)*tf.log(y_pred + eps))

Whereas, I think you were aiming for:

ans = -1*(w1*y_true*tf.log(y_pred+eps) + w2*(1-y_true)*tf.log(1 - y_pred + eps))

Generally we also take the average of this loss so that makes our implementation:

def custom_loss(eps,w1,w2):
    def loss(y_true, y_pred):
        ans = -1*(w1*y_true*tf.log(y_pred+eps) + w2*(1-y_true)*tf.log(1-y_pred+eps))
        return tf.reduce_mean(ans)
    return loss

我们现在可以针对开箱即用的实现进行测试:

y_true = tf.constant([0.1, 0.2])
y_pred = tf.constant([0.11, 0.19])

custom_loss(y_true, y_pred)                         # == 0.41316
tf.keras.losses.binary_crossentropy(y_true, y_pred) # == 0.41317

并发现结果与许多小数位匹配(我无法解释微小的差异 - 可能是不同的 epsilon 值? - 但我想这么小的差异可以忽略不计)

关于python - 自定义损失函数结果与内置损失函数结果不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648180/

相关文章:

python - 为什么不是所有的激活函数都相同?

android - 使用 libyuv 缩放 YUV420 图像会产生奇怪的输出

python - 如何测试tensorflow cifar10 cnn教程模型

machine-learning - 是否有可用的面板以结构化方式存储机器学习模型及其配置文件?

python - 对于 MNIST 图像,前馈 ANN 的测试精度一直停留在 42%

python - 无法从 Raspberry Pi 发射 DC Thunder 导弹发射器

python - 使用 BeautifulSoup 在 python 中提取链接标签之间的文本

tensorflow - 为什么在 keras 中训练 convlstm 层时,每个 epoch 的准确率都会下降到零?

c++ - 从 Eigen::Tensor 创建 tensorflow::Tensor

machine-learning - 什么是光流之间的端点误差?