Keras-自定义损失功能

时间:2020-08-26 16:13:59

标签: python-3.x tensorflow keras deep-learning loss-function

我正在尝试在Keras中实现自定义损失函数,该函数在概念上应类似于“加权分类交叉熵”。

这个想法是,某些错误分类应该比其他错误处罚更多。 我已经有了我的loss_matrix(顺便说一句,它是16x16的矩阵)

唯一可行的解​​决方案就是这个

https://github.com/keras-team/keras/issues/2115#issuecomment-207765342

import functools 
from itertools import product
import keras.backend
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.expand_dims(y_pred_max, 1)
    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],K.floatx()) * K.cast(y_pred_max_mat[:, c_p] ,K.floatx())* K.cast(y_true[:, c_t],K.floatx()))
    return K.categorical_crossentropy(y_pred, y_true) * (final_mask+1) + K.categorical_crossentropy(y_pred, y_true) 
w_array = loss_matrix

ncce = functools.partial(w_categorical_crossentropy, weights=w_array)
ncce.__name__ ='w_categorical_crossentropy'

几个月前它运行良好,但是现在我不得不再次对其进行处理,当我尝试训练模型时,出现此错误:

TypeError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
        return step_function(self, iterator)
    <ipython-input-187-197f9d6ec93b>:7 w_categorical_crossentropy  *
        y_pred_max = K.max(y_pred, axis=1)

    TypeError: 'dict' object is not callable

有人知道如何解决此问题吗?

谢谢

0 个答案:

没有答案