自定义Keras指标,更改

时间:2018-03-14 12:10:28

标签: tensorflow computer-vision keras metrics

我目前正在尝试为Keras创建自己的损失函数(使用Tensorflow后端)。这是一个简单的分类交叉熵,但我在第1列应用了一个因子来惩罚第一类的更多损失。 然而我是Keras的新手,我无法弄清楚如何翻译我的函数(下图),因为我必须使用符号表达式,而且似乎我不能按元素进行:

def custom_categorical_crossentropy(y_true, y_pred):
    y_pred = np.clip(y_pred, _EPSILON, 1.0-_EPSILON)
    out = np.zeros(y_true.shape).astype('float32')
    for i in range(0,y_true.shape[0]):
        for j in range (0,y_true.shape[1]):
            #penalize more all elements on class 1 so that loss takes its low proportion in the dataset into account
            if(j==0):
                out[i][j] = -(prop_database*(y_true[i][j] * np.log(y_pred[i][j]) + (1.0 - y_true[i][j]) * np.log(1.0 - y_pred[i][j])))
            else:
                out[i][j] = -(y_true[i][j] * np.log(y_pred[i][j]) + (1.0 - y_true[i][j]) * np.log(1.0 - y_pred[i][j]))
        out = np.mean(out.astype('float32'), axis=-1)
        return tf.convert_to_tensor(out,
                     dtype=tf.float32,
                     name='custom_loss')

有人可以帮助我吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以在class_weight方法中使用fit来惩罚类而不创建函数:

weights = {
            0:2,
            1:1,
            2:1,
            3:1,
            ...
          }


model.compile(optimizer=chooseOne, loss='categorical_crossentropy')
model.fit(......., class_weight = weights)

这将使第一堂课成为其他班级的两倍。