【问题标题】:Do I need to use backend function for a custom Keras loss我是否需要使用后端功能来自定义 Keras 损失
【发布时间】:2019-07-20 04:03:44
【问题描述】:

我想用 Keras 实现这个paper 中显示的自定义损失函数。

我的损失并没有下降,我感觉这是因为损失的实现:它不使用 Keras 的后端 来处理所有事情,而是结合了一些 @987654322 @函数,简单操作和numpy

def l1_matrix_norm(M):
    return K.cast(K.max(K.sum(K.abs(M), axis=0)), 'float32')

def reconstruction_loss(patch_size, mask, center_weight=0.9):
    mask = mask.reshape(1, *mask.shape).astype('float32')
    mask_inv = 1 - mask

    def loss(y_true, y_pred):
        diff = y_true - y_pred

        center_part = mask * diff
        center_part_normed = l1_matrix_norm(center_part)

        surr_part = mask_inv * diff
        surr_part_normed = l1_matrix_norm(surr_part)

        num_pixels = np.prod(patch_size).astype('float32')

        numerator = center_weight * center_part_normed + (1 - center_weight) * surr_part_normed

        return numerator / num_pixels

    return loss

是否需要使用 Keras 函数,如果需要,我需要它用于哪种类型的操作(我看到一些代码,其中简单的操作,如加法不使用 K)。

另外,如果我必须使用 Keras 后端函数,我可以改用 TensorFlows 函数吗?

【问题讨论】:

    标签: python tensorflow keras loss-function


    【解决方案1】:

    NN 训练取决于能够计算图中所有函数的导数,包括损失函数。 Keras 后端函数和 TensorFlow 函数经过注释,使得 tensorflow(或其他后端)自动知道如何计算梯度。 numpy 函数并非如此。如果您确实知道如何手动计算其梯度,则可以使用非 tf 函数(请参阅tf.custom_gradients)。一般来说,我建议最好坚持使用后端函数,然后在必要时使用 tensorflow 函数。

    【讨论】:

    • 谢谢。我会试试看。最终的损失是否必须是 Keras.backend.constant?
    • 没有。我很确定最终结果不应该是一个常数。常数是一个永远不会改变值的张量。损失函数需要返回一个根据标签(又名 model.targets)和预测计算得出的张量。
    猜你喜欢
    • 2018-12-26
    • 2018-08-06
    • 2018-12-03
    • 2019-11-07
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多