训练时如何在Keras中使用具有三个输入的度量(GAP度量)?

时间:2019-05-21 07:34:26

标签: tensorflow keras keras-layer

这是来自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]) 

1 个答案:

答案 0 :(得分:0)

是的。您可以通过一些小的调整来完成此操作。请注意,像Keras这样的框架支持fun(true, pred)形式的损失函数和度量。函数定义应仅采用这种形式。

第二个限制是truepred的形状必须相同。

调整第一个限制:将两个输出张量串联为一个。假设您有x个输出类,则confpred的形状将是(None, x)。您可以将这两个张量连接成一个形状为final_output的{​​{1}}产生器。

这样做只是第一步。除非我们调整第二个限制,否则它将无法正常工作。

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

但是在您的情况下,None也将具有形状true。您只需在(None, x)处扩展此张量的维度即可得到axis=1,然后可以将新生成的true作为模型的输入提供。

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

现在,您拥有(None, None, x)final_output相同的形状,您只需要切片true即可取回原始的两个张量final_output和{{1 }}中的自定义损失函数和指标。

以上内容纯属逻辑。.要查看示例实现,请检查层和损失函数here