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

Posted

技术标签:

【中文标题】如何在 keras 中测试自定义损失函数?【英文标题】:How to test a custom loss function in keras? 【发布时间】:2018-11-24 12:05:23 【问题描述】:

我正在训练具有两个输出的 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 有关,显然您希望在 Python 中得到答案。因此添加 Python 标签是合理的做法。此外,这已在 Meta here、here 和 here 中讨论过。他们都建议添加框架或库的语言标签。 另外,由于您还没有接受任何答案,看来您正在寻找另一种或更好的解决方案。因此,该编辑有两个好处:1. 那些正在跟踪 python 标签的人会看到您的问题,并可能会提供另一个答案;以及 2. 它使您的问题转到问题“活动”选项卡的顶部(从而增加被别人看到的机会)。总而言之,这只是一些建议,您可以为所欲为。我只是出于好奇而询问原因,因为我以前做过很多次但从未见过这样的事情。 哦,我很抱歉。当我查看更改时,您似乎复制粘贴了完全相同的内容。所有内容都突出显示为已删除并重新插入。所以,我根本没有看到你的变化。 没问题。那是因为我删除了语法高亮指令(即<!-- language-all: lang-py -->);因为添加 Python 标记会自动突出显示语法,并且不再需要该指令。 【参考方案1】:

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

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 接受一批张量,即一组张量,形状未定义。

【讨论】:

我收到AttributeError: module 'keras.backend' has no attribute 'Function',你在导入什么? @GuySoft 您可能正在使用最新版本的 Keras。在 2.3.0 之前的版本中,曾经有一个 Function 类来完成真正的工作(参见 here),而 function(带有小写“f”)只是一个功能接口。现在,在kerastf.keras 中,只有小写版本有效。所以你可以使用小写版本。更新了我的答案以反映这一点。感谢您提及这一点。【参考方案2】:

这是另一种解决方法,

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

【讨论】:

以上是关于如何在 keras 中测试自定义损失函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tf.keras 自定义损失函数中触发 python 函数?

在 Keras 中构建自定义损失函数

如何在 keras 中创建自定义损失函数? (自定义加权二元交叉熵)

如何在生成器提供的 Keras 自定义损失函数中访问样本权重?

y_pred 的自定义损失函数 Keras 仅高于某个阈值

如何在 Keras 中创建这个自定义损失函数并确保它是可微的?