我是否需要为自定义 Keras 损失使用后端函数
Do I need to use backend function for a custom Keras loss
我想用 Keras.
实现此 paper 中显示的自定义损失函数
我的损失没有减少,我觉得这是因为损失的实施:它不使用 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
)。一般来说,我建议最好坚持使用后端函数,然后在必要时使用 tensorflow 函数。
我想用 Keras.
实现此 paper 中显示的自定义损失函数我的损失没有减少,我觉得这是因为损失的实施:它不使用 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
)。一般来说,我建议最好坚持使用后端函数,然后在必要时使用 tensorflow 函数。