【发布时间】:2022-01-13 08:05:55
【问题描述】:
我正在写下我的第一个 allennlp 项目,以检测报纸文章中的特定跨度。我能够在我的数据集上训练它。用交叉熵计算的损失似乎正确减少,但我的指标有一些问题。我编写了一个自定义指标,它应该可以估计我的模型根据一些基本事实跨度预测跨度的准确度。问题是现在,即使损失在减少,我们的指标似乎也没有正确更新。
我不确定如何解决这个问题,我猜我的问题如下:
-
reset()函数在Metric类中的具体用途是什么? - 除了编写
__call__()、get_metric()和reset()函数外,还有其他需要注意的地方吗?
下面是我的自定义Metric 类的快照,以备您需要时使用。
class SpanIdenficationMetric(Metric):
def __init__(self) -> None:
self._s_cardinality = 0 # S: model predicted spans
self._t_cardinality = 0 # T: article gold spans
self._s_sum = 0
self._t_sum = 0
def reset(self) -> None:
self._s_cardinality = 0
self._t_cardinality = 0
self._s_sum = 0
self._t_sum = 0
def __call__(self, prop_spans: torch.Tensor, gold_spans: torch.Tensor, mask: Optional[torch.BoolTensor] = None):
for i, article_spans in enumerate(prop_spans):
if article_spans.numel() == 0:
continue
article_gold_spans = gold_spans[i]
merged_prop_spans = self._merge_intervals(article_spans)
self._s_cardinality += merged_prop_spans.size(dim=0)
self._t_cardinality += article_gold_spans.size(dim=0)
for combination in itertools.product(merged_prop_spans, article_gold_spans):
sspan = combination[0]
tspan = combination[1]
self._s_sum += self._c_function(sspan, tspan, sspan[1].item() - sspan[0].item() + 1)
self._t_sum += self._c_function(sspan, tspan, tspan[1].item() - tspan[0].item() + 1)
def get_metric(self, reset: bool = False):
precision = 0
recall = 0
if self._s_cardinality != 0:
precision = self._s_sum / self._s_cardinality
if self._t_cardinality != 0:
recall = self._t_sum / self._t_cardinality
if reset:
self.reset()
return { "si-metric" : (2 * precision * recall) / (precision + recall) if precision + recall > 0 else 0 }
def _c_function(self, s, t, h): {}
def _intersect(self, s, t): {}
def _merge_intervals(self, prop_spans): {}
提前谢谢你。干杯。
【问题讨论】:
标签: allennlp