这是来自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])
答案 0 :(得分:0)
是的。您可以通过一些小的调整来完成此操作。请注意,像Keras这样的框架支持fun(true, pred)
形式的损失函数和度量。函数定义应仅采用这种形式。
第二个限制是true
和pred
的形状必须相同。
调整第一个限制:将两个输出张量串联为一个。假设您有x
个输出类,则conf
和pred
的形状将是(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。