如何在keras中测试自定义损失函数?

How to test a custom loss function in keras?

我正在训练具有两个输出的 CovNet。我的训练样本如下所示:

[0, value_a1], [0, value_a2], ...

[value_b1, 0], [value_b2, 0], ....

我想生成我自己的包含 mask_value = 0 的损失函数和掩码对。我有这个功能,但我不确定它是否真的符合我的要求。所以,我想写一些测试。

from tensorflow.python.keras import backend as K
from tensorflow.python.keras import losses

def masked_loss_function(y_true, y_pred, mask_value=0):
    '''
    This model has two target values which are independent of each other.
    We mask the output so that only the value that is used for training 
    contributes to the loss.
        mask_value : is the value that is not used for training
    '''
    mask = K.cast(K.not_equal(y_true, mask_value), K.floatx())
    return losses.mean_squared_error(y_true * mask, y_pred * mask)

不过,我不知道如何用keras测试这个功能?通常,这将传递给 model.compile()。类似这些:

x = [1, 0]
y = [1, 1]
assert masked_loss_function(x, y, 0) == 0

我认为实现这一目标的一种方法是使用 Keras 后端函数。这里我们定义了一个函数,它将两个张量作为输入,returns 作为输出一个张量:

from keras import Model
from keras import layers

x = layers.Input(shape=(None,))
y = layers.Input(shape=(None,))
loss_func = K.function([x, y], [masked_loss_function(x, y, 0)])

现在我们可以使用loss_func到运行我们定义的计算图:

assert loss_func([[[1,0]], [[1,1]]]) == [[0]]

请注意,keras 后端函数,即 function,期望输入和输出参数是张量数组。此外,xy 接受一批张量,即张量数组,具有未定义的形状。

这是另一种解决方法,

x = [1, 0]
y = [1, 1]
F = masked_loss_function(K.variable(x), K.variable(y), K.variable(0))
assert K.eval(F) == 0