Remove logloss v2 as this is a duplication of bce with probabilities.
PiperOrigin-RevId: 236696942
This commit is contained in:
parent
7917e18974
commit
55240a22f1
@ -532,34 +532,6 @@ class CategoricalHinge(LossFunctionWrapper):
|
|||||||
categorical_hinge, name=name, reduction=reduction)
|
categorical_hinge, name=name, reduction=reduction)
|
||||||
|
|
||||||
|
|
||||||
@keras_export('keras.losses.LogLoss')
|
|
||||||
class LogLoss(LossFunctionWrapper):
|
|
||||||
"""Computes the log loss between `y_true` and `y_pred`.
|
|
||||||
|
|
||||||
`logloss = - y_true * log(y_pred) - (1 - y_true) * log(1 - y_pred)`
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
```python
|
|
||||||
l = tf.keras.losses.LogLoss()
|
|
||||||
loss = l([0., 1., 1.], [1., 0., 1.])
|
|
||||||
print('Loss: ', loss.numpy()) # Loss: 10.745
|
|
||||||
```
|
|
||||||
|
|
||||||
Usage with tf.keras API:
|
|
||||||
|
|
||||||
```python
|
|
||||||
model = tf.keras.Model(inputs, outputs)
|
|
||||||
model.compile('sgd', loss=tf.keras.losses.LogLoss())
|
|
||||||
```
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
reduction=losses_utils.ReductionV2.SUM_OVER_BATCH_SIZE,
|
|
||||||
name='logloss'):
|
|
||||||
super(LogLoss, self).__init__(logloss, name=name, reduction=reduction)
|
|
||||||
|
|
||||||
|
|
||||||
@keras_export('keras.losses.Poisson')
|
@keras_export('keras.losses.Poisson')
|
||||||
class Poisson(LossFunctionWrapper):
|
class Poisson(LossFunctionWrapper):
|
||||||
"""Computes the Poisson loss between `y_true` and `y_pred`.
|
"""Computes the Poisson loss between `y_true` and `y_pred`.
|
||||||
@ -801,15 +773,6 @@ def categorical_hinge(y_true, y_pred):
|
|||||||
return math_ops.maximum(0., neg - pos + 1.)
|
return math_ops.maximum(0., neg - pos + 1.)
|
||||||
|
|
||||||
|
|
||||||
def logloss(y_true, y_pred):
|
|
||||||
y_pred = ops.convert_to_tensor(y_pred)
|
|
||||||
y_true = math_ops.cast(y_true, y_pred.dtype)
|
|
||||||
losses = math_ops.multiply(y_true, math_ops.log(y_pred + K.epsilon()))
|
|
||||||
losses += math_ops.multiply((1 - y_true),
|
|
||||||
math_ops.log(1 - y_pred + K.epsilon()))
|
|
||||||
return K.mean(-losses, axis=-1)
|
|
||||||
|
|
||||||
|
|
||||||
def huber_loss(y_true, y_pred, delta=1.0):
|
def huber_loss(y_true, y_pred, delta=1.0):
|
||||||
"""Computes Huber loss value.
|
"""Computes Huber loss value.
|
||||||
|
|
||||||
|
@ -1193,97 +1193,6 @@ class CategoricalHingeTest(test.TestCase):
|
|||||||
self.assertAlmostEqual(self.evaluate(loss), 0., 3)
|
self.assertAlmostEqual(self.evaluate(loss), 0., 3)
|
||||||
|
|
||||||
|
|
||||||
@test_util.run_all_in_graph_and_eager_modes
|
|
||||||
class LogLossTest(test.TestCase):
|
|
||||||
|
|
||||||
def setup(self):
|
|
||||||
# TODO(psv): Change to setUp() after b/122319309 is fixed.
|
|
||||||
y_pred = np.asarray([.9, .2, .2, .8, .4, .6]).reshape((2, 3))
|
|
||||||
y_true = np.asarray([1., 0., 1., 1., 0., 0.]).reshape((2, 3))
|
|
||||||
epsilon = 1e-7 # to avoid log 0
|
|
||||||
|
|
||||||
self.batch_size = 6
|
|
||||||
self.expected_losses = np.multiply(y_true, np.log(y_pred + epsilon))
|
|
||||||
self.expected_losses += np.multiply(1 - y_true,
|
|
||||||
np.log(1 - y_pred + epsilon))
|
|
||||||
self.expected_losses = -self.expected_losses
|
|
||||||
|
|
||||||
self.y_pred = constant_op.constant(y_pred)
|
|
||||||
self.y_true = constant_op.constant(y_true)
|
|
||||||
|
|
||||||
def test_config(self):
|
|
||||||
log_loss_obj = keras.losses.LogLoss(
|
|
||||||
reduction=losses_utils.ReductionV2.SUM, name='log')
|
|
||||||
self.assertEqual(log_loss_obj.name, 'log')
|
|
||||||
self.assertEqual(log_loss_obj.reduction, losses_utils.ReductionV2.SUM)
|
|
||||||
|
|
||||||
def test_all_correct(self):
|
|
||||||
self.setup()
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
loss = log_loss_obj(self.y_true, self.y_true)
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), 0.0, 3)
|
|
||||||
|
|
||||||
def test_unweighted(self):
|
|
||||||
self.setup()
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
loss = log_loss_obj(self.y_true, self.y_pred)
|
|
||||||
actual_loss = np.sum(self.expected_losses) / self.batch_size
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), actual_loss, 3)
|
|
||||||
|
|
||||||
def test_scalar_weighted(self):
|
|
||||||
self.setup()
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
sample_weight = 2.3
|
|
||||||
loss = log_loss_obj(self.y_true, self.y_pred, sample_weight=sample_weight)
|
|
||||||
actual_loss = sample_weight * np.sum(self.expected_losses) / self.batch_size
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), actual_loss, 3)
|
|
||||||
|
|
||||||
# Verify we get the same output when the same input is given
|
|
||||||
loss_2 = log_loss_obj(self.y_true, self.y_pred, sample_weight=sample_weight)
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), self.evaluate(loss_2), 3)
|
|
||||||
|
|
||||||
def test_sample_weighted(self):
|
|
||||||
self.setup()
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
sample_weight = constant_op.constant((1.2, 3.4), shape=(2, 1))
|
|
||||||
|
|
||||||
loss = log_loss_obj(self.y_true, self.y_pred, sample_weight=sample_weight)
|
|
||||||
actual_loss = np.multiply(
|
|
||||||
self.expected_losses,
|
|
||||||
np.asarray([1.2, 1.2, 1.2, 3.4, 3.4, 3.4]).reshape((2, 3)))
|
|
||||||
actual_loss = np.sum(actual_loss) / self.batch_size
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), actual_loss, 3)
|
|
||||||
|
|
||||||
def test_timestep_weighted(self):
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
|
|
||||||
y_pred = np.asarray([.9, .2, .2, .8, .4, .6]).reshape((2, 3, 1))
|
|
||||||
y_true = np.asarray([1., 0., 1., 1., 0., 0.]).reshape((2, 3, 1))
|
|
||||||
epsilon = 1e-7 # to avoid log 0
|
|
||||||
batch_size = 6
|
|
||||||
|
|
||||||
expected_losses = np.multiply(y_true, np.log(y_pred + epsilon))
|
|
||||||
expected_losses += np.multiply(1 - y_true, np.log(1 - y_pred + epsilon))
|
|
||||||
|
|
||||||
y_pred = constant_op.constant(y_pred)
|
|
||||||
y_true = constant_op.constant(y_true)
|
|
||||||
sample_weight = np.array([3, 6, 5, 0, 4, 2]).reshape((2, 3, 1))
|
|
||||||
loss = log_loss_obj(
|
|
||||||
y_true,
|
|
||||||
y_pred,
|
|
||||||
sample_weight=constant_op.constant(sample_weight, shape=(2, 3)))
|
|
||||||
actual_loss = np.multiply(-expected_losses, sample_weight)
|
|
||||||
actual_loss = np.sum(actual_loss) / batch_size
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), actual_loss, 3)
|
|
||||||
|
|
||||||
def test_zero_weighted(self):
|
|
||||||
self.setup()
|
|
||||||
log_loss_obj = keras.losses.LogLoss()
|
|
||||||
sample_weight = 0
|
|
||||||
loss = log_loss_obj(self.y_true, self.y_pred, sample_weight=sample_weight)
|
|
||||||
self.assertAlmostEqual(self.evaluate(loss), 0., 3)
|
|
||||||
|
|
||||||
|
|
||||||
@test_util.run_all_in_graph_and_eager_modes
|
@test_util.run_all_in_graph_and_eager_modes
|
||||||
class LogCoshTest(test.TestCase):
|
class LogCoshTest(test.TestCase):
|
||||||
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
path: "tensorflow.keras.losses.LogLoss"
|
|
||||||
tf_class {
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LogLoss\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LossFunctionWrapper\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.Loss\'>"
|
|
||||||
is_instance: "<type \'object\'>"
|
|
||||||
member_method {
|
|
||||||
name: "__init__"
|
|
||||||
argspec: "args=[\'self\', \'reduction\', \'name\'], varargs=None, keywords=None, defaults=[\'sum_over_batch_size\', \'logloss\'], "
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "call"
|
|
||||||
argspec: "args=[\'self\', \'y_true\', \'y_pred\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "from_config"
|
|
||||||
argspec: "args=[\'cls\', \'config\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "get_config"
|
|
||||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
}
|
|
@ -32,10 +32,6 @@ tf_module {
|
|||||||
name: "LogCosh"
|
name: "LogCosh"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
}
|
}
|
||||||
member {
|
|
||||||
name: "LogLoss"
|
|
||||||
mtype: "<type \'type\'>"
|
|
||||||
}
|
|
||||||
member {
|
member {
|
||||||
name: "Loss"
|
name: "Loss"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
path: "tensorflow.keras.losses.LogLoss"
|
|
||||||
tf_class {
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LogLoss\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LossFunctionWrapper\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.Loss\'>"
|
|
||||||
is_instance: "<type \'object\'>"
|
|
||||||
member_method {
|
|
||||||
name: "__init__"
|
|
||||||
argspec: "args=[\'self\', \'reduction\', \'name\'], varargs=None, keywords=None, defaults=[\'sum_over_batch_size\', \'logloss\'], "
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "call"
|
|
||||||
argspec: "args=[\'self\', \'y_true\', \'y_pred\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "from_config"
|
|
||||||
argspec: "args=[\'cls\', \'config\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "get_config"
|
|
||||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
}
|
|
@ -32,10 +32,6 @@ tf_module {
|
|||||||
name: "LogCosh"
|
name: "LogCosh"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
}
|
}
|
||||||
member {
|
|
||||||
name: "LogLoss"
|
|
||||||
mtype: "<type \'type\'>"
|
|
||||||
}
|
|
||||||
member {
|
member {
|
||||||
name: "Loss"
|
name: "Loss"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
path: "tensorflow.losses.LogLoss"
|
|
||||||
tf_class {
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LogLoss\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.LossFunctionWrapper\'>"
|
|
||||||
is_instance: "<class \'tensorflow.python.keras.losses.Loss\'>"
|
|
||||||
is_instance: "<type \'object\'>"
|
|
||||||
member_method {
|
|
||||||
name: "__init__"
|
|
||||||
argspec: "args=[\'self\', \'reduction\', \'name\'], varargs=None, keywords=None, defaults=[\'sum_over_batch_size\', \'logloss\'], "
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "call"
|
|
||||||
argspec: "args=[\'self\', \'y_true\', \'y_pred\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "from_config"
|
|
||||||
argspec: "args=[\'cls\', \'config\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
member_method {
|
|
||||||
name: "get_config"
|
|
||||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
|
||||||
}
|
|
||||||
}
|
|
@ -32,10 +32,6 @@ tf_module {
|
|||||||
name: "LogCosh"
|
name: "LogCosh"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
}
|
}
|
||||||
member {
|
|
||||||
name: "LogLoss"
|
|
||||||
mtype: "<type \'type\'>"
|
|
||||||
}
|
|
||||||
member {
|
member {
|
||||||
name: "Loss"
|
name: "Loss"
|
||||||
mtype: "<type \'type\'>"
|
mtype: "<type \'type\'>"
|
||||||
|
Loading…
Reference in New Issue
Block a user