4
votes

I am trying to implement a custom objective function in keras frame. Respectively a weighted average function that takes the two arguments tensors y_true and y_pred ; the weights information is derived from y_true tensor.

Is there a weighted average function in tensorflow ? Or any other suggestions on how to implement this kind of loss function ?

My function would look something like this:

function(y_true,y_pred) A=(y_true-y_pred)**2 w - derivable from y_true, tensor of same shape as y_true return average(A, weights=w) <-- a scalar

y_true and y_pred are 3D tensors.

1
here a simple way to operate a learnable weighted average: stackoverflow.com/questions/62595660/…Marco Cerliani

1 Answers

1
votes

you can use one of the existing objectives (also called loss) on keras from here.

you may also implement your own custom function loss:

from keras import backend as K

def my_loss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

# Let's train the model using RMSprop
model.compile(loss=my_loss, optimizer='SGD', metrics=['accuracy'])

notice the K module, its the keras backend you should use to fully utilize keras performance, dont do something like this unless you dont care from performance issues:

def my_bad_and_slow_loss(y_true, y_pred):
    return sum((y_pred - y_true) ** 2, axis=-1)

for your specific case, please write your desired objective function if you need help to write it.

Update

you can try this to provide weights - W as loss function:

def my_loss(y_true, y_pred):
    W = np.arange(9) / 9.  # some example W
    return K.mean(K.pow(y_true - y_pred, 2) * W)