首页 > 解决方案 > 如何在训练时在 Keras 中使用具有三个输入的指标(GAP 指标)?

问题描述

这是来自kaggle的 GAP 指标代码

def GAP(pred, conf, true):
    x = pd.DataFrame({'pred': pred, 'conf': conf, 'true': true})
    x.sort_values('conf', ascending=False, inplace=True, na_position='last')
    x['correct'] = (x.true == x.pred).astype(int)
    x['prec_k'] = x.correct.cumsum() / (np.arange(len(x)) + 1)
    x['term'] = x.prec_k * x.correct
    gap = x.term.sum() / x.true.count()

    return gap

我想在训练时使用它,但它会得到conf参数 - 概率向量或预测置信度分数。但是指标必须只有两个参数。有没有可能像这样使用它:

model.compile(loss='my_loss',metrics=[GAP]) 

标签: tensorflowkeraskeras-layer

解决方案


是的.. 有一种方法可以通过一个小的调整来做到这一点。请注意,像 Keras 这样的框架支持损失函数和形式的度量fun(true, pred)。函数定义只能采用这种形式。

此外,第二个限制是,两者的形状true必须pred相同。

调整第一个限制:将两个输出张量连接成一个。假设您有x多个输出类,那么conf和的形状pred将为(None, x)。您可以将这两个张量连接成一个产生final_outputshape (None, 2, x)

这样做只是第一步。除非我们调整第二个限制,否则它不会起作用。

现在让我们调整第二个限制:这个限制可以缩短为:“这两个张量的维度必须相同。” 请注意,我试图减少从形状到尺寸的限制。这可以通过具有动态形状来完成,例如:shape(true) = (None, 1, x) and shape(pred) = (None, None, x)不会抛出错误,因为None可以在运行时取任何值。简而言之,在模型的末尾添加一个层来组合输出,并且该层应该具有动态输出形状。

但在你的情况下,true也会有 shape (None, x)。你可以扩展这个张量的维度axis=1来获取(None, 1, x),然后新生成的真值可以作为模型的输入提供。

请注意,当您组合两个张量时,final_output将始终具有(None, 2, x)不等于 的形状(None, 1, x)。但是由于我们已经将最后一层配置为返回动态形状,即(None, None, x),这在编译时不会成为问题。并且 Keras 在运行时从不检查形状不匹配,除非对张量的操作会导致该错误

现在,您具有final_output与 相同的形状true,您只需将 切片final_output以取回原始的两个张量pred以及conf您的自定义损失函数和指标。

以上纯属合乎逻辑。要查看示例实现,请在此处查看层和损失函数。


推荐阅读