0

I understand that mse will treat both actual - predict, and predict - actual the same way. I want to write a custom loss function such that the penalty of predict > actual is more than actual > predict Say I will have 2x more penalty for being predict > actual. How would I implement such function

import numpy as np

from keras.models import Model
from keras.layers import Input

import keras.backend as K
from keras.engine.topology import Layer
from keras.layers.core import  Dense

from keras import objectives

def create_model():
    # define the size
    input_size = 6
    hidden_size = 15;
    # definte the model
    model = Sequential()
    model.add(Dense(input_size, input_dim=input_size, kernel_initializer='normal', activation='relu'))
    model.add(Dense(hidden_size, kernel_initializer='normal', activation='relu'))
    model.add(Dense(1, kernel_initializer='normal'))

    # mse is used as loss for the optimiser to converge quickly
    # mae is something you can quantify the manitude
    model.compile(optimizer='adam', loss='mse', metrics=['mae'])

    return model

early_stop = EarlyStopping(monitor='val_loss', patience=20)
history = model.fit(train_features, train_label, epochs=200, validation_split=0.2, verbose=0, shuffle=True)
predvalue = model.predict(test_features).flatten() * 100

How do I implement such loss function?

Hairy Ass
  • 190
  • 2
  • 10

1 Answers1

7
def customLoss(true,pred):
    diff = pred - true

    greater = K.greater(diff,0)
    greater = K.cast(greater, K.floatx()) #0 for lower, 1 for greater
    greater = greater + 1                 #1 for lower, 2 for greater

    #use some kind of loss here, such as mse or mae, or pick one from keras
    #using mse:
    return K.mean(greater*K.square(diff))

model.compile(optimizer = 'adam', loss = customLoss)
Daniel Möller
  • 84,878
  • 18
  • 192
  • 214