我是否需要使用后端函数来自定义 Keras 丢失



我想用 Keras 实现本文中所示的自定义损失函数。

我的损失没有下降,我感觉这是因为损失的实施:它没有使用 Keras 的后端来处理所有事情,而是结合了一些K功能、简单的操作和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 函数吗?

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

最新更新