tensorflow - 如何在训练时在 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])
解决方案
是的.. 有一种方法可以通过一个小的调整来做到这一点。请注意,像 Keras 这样的框架支持损失函数和形式的度量fun(true, pred)
。函数定义只能采用这种形式。
此外,第二个限制是,两者的形状true
必须pred
相同。
调整第一个限制:将两个输出张量连接成一个。假设您有x
多个输出类,那么conf
和的形状pred
将为(None, x)
。您可以将这两个张量连接成一个产生final_output
shape (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
您的自定义损失函数和指标。
以上纯属合乎逻辑。要查看示例实现,请在此处查看层和损失函数。
推荐阅读
- c# - Android.views.windowmanagerbadtokenexception:无法添加窗口--token android.os.binderproxy
- java - 使用继承和/或聚合重构 Maven 项目
- c# - 如何计算 C# 方法中的初始化字段?
- angular - 在 @ng-select/ng-select 中在 Angular 中的自我更改事件中设置默认下拉 bindLabel?
- google-cloud-dataflow - 窗口会话完成后是否会触发数据流触发器?
- javascript - window.open - 源代码中的 js 未加载
- javascript - 如何处理特定元素中的滚动?
- javascript - NodeJS MongoDB投影不工作
- python - 使用 python 脚本的 Git 拉取
- lua - 范围内的数字加法(溢出)