How To Create Custom Objective Function In Keras?
Solution 1:
Here is my small snippet to write new loss functions and test them before using:
import numpy as np
from keras import backend as K
_EPSILON = K.epsilon()
def_loss_tensor(y_true, y_pred):
y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = -(y_true * K.log(y_pred) + (1.0 - y_true) * K.log(1.0 - y_pred))
return K.mean(out, axis=-1)
def_loss_np(y_true, y_pred):
y_pred = np.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = -(y_true * np.log(y_pred) + (1.0 - y_true) * np.log(1.0 - y_pred))
return np.mean(out, axis=-1)
defcheck_loss(_shape):
if _shape == '2d':
shape = (6, 7)
elif _shape == '3d':
shape = (5, 6, 7)
elif _shape == '4d':
shape = (8, 5, 6, 7)
elif _shape == '5d':
shape = (9, 8, 5, 6, 7)
y_a = np.random.random(shape)
y_b = np.random.random(shape)
out1 = K.eval(_loss_tensor(K.variable(y_a), K.variable(y_b)))
out2 = _loss_np(y_a, y_b)
assert out1.shape == out2.shape
assert out1.shape == shape[:-1]
print np.linalg.norm(out1)
print np.linalg.norm(out2)
print np.linalg.norm(out1-out2)
deftest_loss():
shape_list = ['2d', '3d', '4d', '5d']
for _shape in shape_list:
check_loss(_shape)
print'======================'if __name__ == '__main__':
test_loss()
Here as you can see I am testing the binary_crossentropy loss, and have 2 separate losses defined, one numpy version (_loss_np) another tensor version (_loss_tensor) [Note: if you just use the keras functions then it will work with both Theano and Tensorflow... but if you are depending on one of them you can also reference them by K.theano.tensor.function or K.tf.function]
Later I am comparing the output shapes and the L2 norm of the outputs (which should be almost equal) and the L2 norm of the difference (which should be towards 0)
Once you are satisfied that your loss function is working properly you can use it as:
model.compile(loss=_loss_tensor, optimizer=sgd)
Solution 2:
(Answer Fixed) A simple way to do it is calling Keras backend:
import keras.backend as K
defcustom_loss(y_true,y_pred):
return K.mean((y_true - y_pred)**2)
Then:
model.compile(loss=custom_loss, optimizer=sgd,metrics = ['accuracy'])
that equals
model.compile(loss='mean_squared_error', optimizer=sgd,metrics = ['accuracy'])
Post a Comment for "How To Create Custom Objective Function In Keras?"