我在 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
- 使用 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/