我正在尝试在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
有人知道如何解决此问题吗?
谢谢