def w_categorical_crossentropy(y_true, y_pred, weights):
nb_cl = len(weights)
final_mask = K.zeros_like(y_pred[:, 0])
y_pred_max = K.max(y_pred, axis=1)
y_pred_max = K.reshape(y_pred_max, K.shape(y_pred))
y_pred_max_mat = K.equal(y_pred, y_pred_max)
for c_p, c_t in product(range(nb_cl), range(nb_cl)):
final_mask += (K.cast(weights[c_t, c_p],tf.float32) * K.cast(y_pred_max_mat[:, c_p] ,
tf.float32)* K.cast(y_true[:, c_t],tf.float32))
return K.categorical_crossentropy(y_pred, y_true) * final_mask
ncce = partial(w_categorical_crossentropy, weights=np.ones((3,3)))
ncce.__name__ ='w_categorical_crossentropy'