# Custom conditional loss function in Keras

I'm looking for a way to create a conditional loss function that looks like this: there is a vector of labels, say l (l has the same length as the input x), then for a given input (y_true, y_pred, l) the loss should be:

def conditional_loss_function(y_true, y_pred, l):
loss = if l is 0: loss_funtion1
if l is 1: loss_funtion2
return loss


It is like a kind of semi-supervised loss funtion.

You should be able to solve this with currying. Make a function that takes the label as input and returns a function which takes y_true and y_pred as input. Note that the label needs to be a constant or a tensor for this to work.

def conditional_loss_function(l):
def loss(y_true, y_pred):
if l == 0:
return loss_funtion1(y_true, y_pred)
else:
return loss_funtion2(y_true, y_pred)
return loss

model.compile(loss=conditional_loss_function(l), optimizer=...)


Small working example with different loss function depending on the label:

# load pima indians dataset
data = dataset[:,0:8]
label = dataset[:,8]

X = Input(shape=(8,))
Y = Input(shape=(1,))
x = Dense(12, input_dim=8, activation='relu')(X)
x = Dense(8, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x)

def custom_loss(l):
def loss(y_true, y_pred):
if l == 0:
return binary_crossentropy(y_true, y_pred)
else:
return mean_squared_error(y_true, y_pred)
return loss

# Compile model
model = Model(inputs=[X, Y], outputs=predictions)