Ejemplo n.º 1
0
def mask_loss(loss, mask_value=MASK_VALUE):
    """Generates a new loss function that ignores values where `y_true == mask_value`.

    # Arguments
        loss: str; name of the keras loss function from `keras.losses`
        mask_value: int; which values should be masked

    # Returns
        function; Masked version of the `loss`

    # Example
        ```python
                categorical_crossentropy_masked = mask_loss("categorical_crossentropy")
        ```
    """
    loss_fn = kloss.deserialize(loss)

    def masked_loss_fn(y_true, y_pred):
        # currently not suppoerd with NA's:
        #  - there is no K.is_nan impolementation in keras.backend
        #  - https://github.com/fchollet/keras/issues/1628
        mask = K.cast(K.not_equal(y_true, mask_value), K.floatx())

        # we divide by the mean to correct for the number of done loss evaluations
        return loss_fn(y_true * mask, y_pred * mask) / K.mean(mask)

    masked_loss_fn.__name__ = loss + "_masked"
    return masked_loss_fn
Ejemplo n.º 2
0
def test_serializing_loss_class():
    orig_loss_class = MSE_MAE_loss(0.3)
    with custom_object_scope({'MSE_MAE_loss': MSE_MAE_loss}):
        serialized = losses.serialize(orig_loss_class)

    with custom_object_scope({'MSE_MAE_loss': MSE_MAE_loss}):
        deserialized = losses.deserialize(serialized)
    assert isinstance(deserialized, MSE_MAE_loss)
    assert deserialized.mse_fraction == 0.3
Ejemplo n.º 3
0
def test_serializing_loss_class():
    orig_loss_class = MSE_MAE_loss(0.3)
    with custom_object_scope({'MSE_MAE_loss': MSE_MAE_loss}):
        serialized = losses.serialize(orig_loss_class)

    with custom_object_scope({'MSE_MAE_loss': MSE_MAE_loss}):
        deserialized = losses.deserialize(serialized)
    assert isinstance(deserialized, MSE_MAE_loss)
    assert deserialized.mse_fraction == 0.3