speechbrain.utils.metric_stats 模块

metric_stats 模块提供了一个抽象类,用于存储实验过程中产生的统计数据并对其进行总结。

Authors:
  • 彼得·普兰廷加 2020

  • Mirco Ravanelli 2020

  • Gaëlle Laperrière 2021

  • 萨哈尔·加奈 2021

摘要

类:

BinaryMetricStats

跟踪二元指标,如精确率、召回率、F1、EER等。

ClassificationStats

计算与多标签分类任务相关的统计信息,以及可以为了评估目的而松散解释为多标签分类的任务。

EmbeddingErrorRateSimilarity

实现了EmbER度量中定义的相似度函数,如https://www.isca-archive.org/interspeech_2022/roux22_interspeech.pdf所述

ErrorRateStats

用于跟踪错误率(例如,WER,PER)的类。

MetricStats

用于存储和总结任意指标的默认类。

MultiMetricStats

一个同时评估多个指标的包装器

WeightedErrorRateStats

该指标使用任何选择的方法重新加权来自ErrorRateStats的WER。

函数:

EER

计算EER(及其阈值)。

minDCF

计算通常用于评估说话人验证系统的minDCF指标。

multiprocess_evaluation

如果并行运行多个作业,则运行指标评估。

sequence_evaluation

按顺序对输入进行度量评估。

参考

class speechbrain.utils.metric_stats.MetricStats(metric, n_jobs=1, batch_eval=True)[source]

基础类:object

用于存储和总结任意指标的默认类。

通过子类化这个类可以创建更复杂的指标。

Parameters:
  • metric (function) – 用于计算相关指标的函数。应至少接受两个参数(predictions 和 targets),并且可以选择性地接受任一或两个参数的相对长度。通常在子类中不使用。

  • n_jobs (int) – 用于计算指标的作业数量。如果大于一,每个样本将单独处理,否则整个批次将一次性传递。

  • batch_eval (bool) – 当为True时,它使用批量输入来评估指标。 当为False且n_jobs=1时,它按顺序逐个执行指标评估。 当为False且n_jobs>1时,评估使用joblib在不同的输入上并行运行。

Example

>>> from speechbrain.nnet.losses import l1_loss
>>> loss_stats = MetricStats(metric=l1_loss)
>>> loss_stats.append(
...      ids=["utterance1", "utterance2"],
...      predictions=torch.tensor([[0.1, 0.2], [0.2, 0.3]]),
...      targets=torch.tensor([[0.1, 0.2], [0.1, 0.2]]),
...      reduction="batch",
... )
>>> stats = loss_stats.summarize()
>>> stats['average']
0.050...
>>> stats['max_score']
0.100...
>>> stats['max_id']
'utterance2'
clear()[source]

创建用于存储的空容器,删除现有统计信息。

append(ids, *args, **kwargs)[source]

存储一组特定的指标分数。

Parameters:
  • ids (list) – 对应于话语的ID列表。

  • *args (tuple) – 传递给度量函数的参数。

  • **kwargs (dict) – 传递给度量函数的参数。

summarize(field=None)[source]

总结指标分数,返回相关统计数据。

Parameters:

field (str) – 如果提供,仅返回选定的统计信息。如果不提供,则返回所有计算的统计信息。

Returns:

如果提供了field,则返回一个浮点数,否则返回包含所有计算统计信息的字典。

Return type:

floatdict

write_stats(filestream, verbose=False)[source]

将所有相关统计数据写入文件。

Parameters:
  • filestream (类文件对象) – 用于写入统计数据的流。

  • verbose (bool) – 是否也将统计信息打印到标准输出。

speechbrain.utils.metric_stats.multiprocess_evaluation(metric, predict, target, lengths=None, n_jobs=8)[source]

如果并行运行多个作业,则运行度量评估。

speechbrain.utils.metric_stats.sequence_evaluation(metric, predict, target, lengths=None)[source]

按顺序对输入进行度量评估。

class speechbrain.utils.metric_stats.ErrorRateStats(merge_tokens=False, split_tokens=False, space_token='_', keep_values=True, extract_concepts_values=False, tag_in='', tag_out='', equality_comparator: ~typing.Callable[[str, str], bool] = <function _str_equals>)[source]

基础:MetricStats

一个用于跟踪错误率(例如,WER,PER)的类。

Parameters:
  • merge_tokens (bool) – 是否合并连续的标记(用于例如,从字符标记创建单词)。 参见 speechbrain.dataio.dataio.merge_char

  • split_tokens (bool) – 是否拆分标记(用于例如从单词标记创建字符)。 参见 speechbrain.dataio.dataio.split_word

  • space_token (str) – 用于边界的字符。与merge_tokens一起使用时,表示合并后要拆分的字符。 与split_tokens一起使用时,序列会与此标记连接,然后整个序列被拆分。

  • keep_values (bool) – 是否保留概念的值。

  • extract_concepts_values (bool) – 处理预测和目标,仅保留概念和值。

  • tag_in (str) – 概念的开始(例如‘<’)。

  • tag_out (str) – 概念的结束(例如‘>’)。

  • equality_comparator (Callable[[str, str], bool]) – 用于检查两个单词是否相等的函数。

Example

>>> cer_stats = ErrorRateStats()
>>> i2l = {0: 'a', 1: 'b'}
>>> cer_stats.append(
...     ids=['utterance1'],
...     predict=torch.tensor([[0, 1, 1]]),
...     target=torch.tensor([[0, 1, 0]]),
...     target_len=torch.ones(1),
...     ind2lab=lambda batch: [[i2l[int(x)] for x in seq] for seq in batch],
... )
>>> stats = cer_stats.summarize()
>>> stats['WER']
33.33...
>>> stats['insertions']
0
>>> stats['deletions']
0
>>> stats['substitutions']
1
append(ids, predict, target, predict_len=None, target_len=None, ind2lab=None)[source]

向相关容器添加统计信息。

  • 参见 MetricStats.append()

Parameters:
  • ids (list) – 对应于话语的ID列表。

  • predict (torch.tensor) – 一个预测输出,用于与目标输出进行比较

  • target (torch.tensor) – 正确的参考输出,用于与预测进行比较。

  • predict_len (torch.tensor) – 预测的相对长度,用于在预测中存在填充时撤销填充。

  • target_len (torch.tensor) – 目标输出的相对长度,用于在目标中存在填充时取消填充。

  • ind2lab (可调用) – 可调用对象,用于从索引映射到标签,操作于批次上,用于写入对齐。

summarize(field=None)[source]

总结错误率并返回相关统计信息。

  • 参见 MetricStats.summarize()

write_stats(filestream)[source]

将所有相关信息(例如,错误率对齐)写入文件。 * 参见 MetricStats.write_stats()

class speechbrain.utils.metric_stats.WeightedErrorRateStats(base_stats: 错误率统计, cost_function: Callable[[str, str | None, str | None], float], weight_name: str = 'weighted')[source]

基础:MetricStats

该指标使用任何选择的方法重新加权来自ErrorRateStats的WER。这不会编辑找到的编辑序列(插入/删除/替换),但会将它们对指标的影响乘以成本函数返回的0到1之间的值。

Parameters:
  • base_stats (ErrorRateStats) – 使用的基础WER计算器。

  • cost_function (Callable[[str, Optional[str], Optional[str]], float]) – 签名为 fn(edit_symbol, a, b) -> float 的成本函数,其中 返回值在0到1之间,是在加权WER计算中应分配给特定编辑的权重。 在插入和删除的情况下,ab 可能为 None。在替换的情况下,ab 永远不会是 None

  • weight_name (str) – 要添加到每个指标名称前面的前缀(例如 xxx_wer

append(*args, **kwargs)[source]

附加函数,不应用于加权错误率统计。请附加到指定的base_stats

WeightedErrorRateStats 重用了基础类 ErrorRateStats 的分数。

Parameters:
  • *args (tuple) – 忽略。

  • **kwargs (dict) – 忽略。

summarize(field=None)[source]

返回一个包含一些详细WER统计信息的字典,该字典通过cost_function确定每个编辑的权重(无错误时返回0.0,默认错误行为时返回1.0,以及介于两者之间的任何值)。

不需要调用summarize()

完整的字段集,每个字段都以`_`为前缀: - wer: 加权WER(比率 *100) - insertions: 加权插入 - substitutions: 加权替换 - deletions: 加权删除 - num_edits: 加权插入/替换/删除的总和

此外,此函数为每对句子填充了一个scores列表。该列表的每个条目都是一个字典,包含以下字段: - key: 话语的ID。 - WER, insertions, substitutions, deletions, num_edits 包含

与上述相同的语义,但在句子级别而不是全局级别。

Parameters:

field (str, optional) – 如果您只对其中的一个字段感兴趣,则返回该字段。 如果指定,则返回一个float,否则返回一个字典。

Returns:

  • 从字符串到浮点数的字典,如果 field is None – 上述文档中字段的字典。

  • 浮点数,如果 field is not None – 由 field 选择的单个字段。

write_stats(filestream)[source]

将所有相关信息写入文件;这里,只写入由summarize返回的加权信息。 参见write_stats()

class speechbrain.utils.metric_stats.EmbeddingErrorRateSimilarity(embedding_function: Callable[[str], Tensor | None], low_similarity_weight: float, high_similarity_weight: float, threshold: float)[source]

基础类:object

实现由https://www.isca-archive.org/interspeech_2022/roux22_interspeech.pdf定义的EmbER度量中的相似度函数

该指标涉及一个字典,用于将标记映射到单个词嵌入。当嵌入足够相似时,WER中的替换会被加权降低。目标是减少具有较小语义影响的替换错误的影响。只有替换错误会被加权。

这是通过计算两个嵌入之间的余弦相似度来完成的,然后如果similarity >= threshold,则用low_similarity_weight来加权替换,否则用high_similarity_weight来加权替换(例如,高相似度的替换可能会被加权到只有低相似度替换的10%的重要性)。

注意

引用的论文推荐(1.0, 0.1, 0.4)作为fastTexst法语嵌入的默认值,这是根据经验选择的。当使用不同的嵌入时,您可能希望测试其他值;因此我们不提供默认值。

Parameters:
  • embedding_function (Callable[[str], Optional[torch.Tensor]]) – 从单词返回嵌入(作为torch.Tensor)的函数。如果找不到该单词的对应嵌入,则应返回None。在这种情况下,将选择low_similarity_weight

  • low_similarity_weight (float) – 如果 cosine_similarity < threshold,则应用于替换的权重。

  • high_similarity_weight (float) – 如果 cosine_similarity >= threshold,则应用于替换的权重。

  • threshold (float) – 用于选择替换错误应如何权衡该词的余弦相似度阈值。

__call__(edit_symbol: str, a: str | None, b: str | None) float[source]

返回在WER计算中应与特定编辑相关联的权重。

成本函数的兼容候选者,因此可以将此类的实例作为cost_function传递。

Parameters:
  • edit_symbol (str) – 由WER函数分配的编辑符号,参见 EDIT_SYMBOLS

  • a (str, 可选) – 要比较的第一个词(如果存在)

  • b (str, 可选) – 要比较的第二个单词(如果存在)

Returns:

分配给编辑的权重。 对于实际编辑,根据嵌入距离和阈值,使用low_similarity_weighthigh_similarity_weight

Return type:

float

class speechbrain.utils.metric_stats.BinaryMetricStats(positive_label=1)[source]

基础:MetricStats

跟踪二进制指标,如精确率、召回率、F1、EER等。

clear()[source]

清除存储的指标。

append(ids, scores, labels)[source]

将分数和标签附加到内部列表中。

在总结之前不计算指标,因为自动阈值(例如,EER)需要完整的分数集。

Parameters:
  • ids (list) – 样本的字符串ID。

  • scores (list) – 与ids对应的分数。

  • labels (list) – 与ids对应的标签。

summarize(field=None, threshold=None, max_samples=None, beta=1, eps=1e-08)[source]

使用完整的分数集计算统计信息。

Full set of fields:
  • TP - 真正例

  • TN - 真阴性

  • FP - 假阳性

  • FN - 假阴性

  • FAR - 错误接受率

  • FRR - 错误拒绝率

  • DER - 检测错误率(如果没有传递阈值,则为EER)

  • threshold - 阈值(如果没有传递阈值,则为EER阈值)

  • precision - 精确度(正预测值)

  • recall - 召回率(灵敏度)

  • F分数 - 精确率和召回率的平衡(当beta=1时相等)

  • MCC - 马修斯相关系数

Parameters:
  • field (str) – 用于选择单个统计量的键。如果未提供,则返回包含所有统计量的字典。

  • threshold (float) – 如果没有提供阈值,则使用等错误率。

  • max_samples (float) – 保留多少样本用于正/负分数。 如果未提供 max_samples,则保留所有分数。 仅在阈值为 None 时有效。

  • beta (float) – 在F-score中,如何权衡精度与召回率。默认值为1,表示同等权重,而较高的值会使召回率权重更高,较低的值会使精度权重更高。

  • eps (float) – 一个小的值,用于避免除以零。

Returns:

如果指定了字段,则仅返回该字段的分数。 如果字段为None,则返回完整的字段集。

Return type:

摘要

speechbrain.utils.metric_stats.EER(positive_scores, negative_scores)[source]

计算EER(及其阈值)。

Parameters:
  • positive_scores (torch.tensor) – 来自同一类别条目的分数。

  • negative_scores (torch.tensor) – 来自不同类别条目的分数。

Returns:

  • EER (float) – EER分数。

  • threshold (float) – EER分数对应的阈值。

Example

>>> positive_scores = torch.tensor([0.6, 0.7, 0.8, 0.5])
>>> negative_scores = torch.tensor([0.4, 0.3, 0.2, 0.1])
>>> val_eer, threshold = EER(positive_scores, negative_scores)
>>> val_eer
0.0
speechbrain.utils.metric_stats.minDCF(positive_scores, negative_scores, c_miss=1.0, c_fa=1.0, p_target=0.01)[source]

计算通常用于评估说话人验证系统的minDCF指标。min_DCF是在定义的阈值范围内计算的以下C_det函数的最小值:

C_det = c_miss * p_miss * p_target + c_fa * p_fa * (1 -p_target)

其中 p_miss 是缺失概率,p_fa 是误报概率。

Parameters:
  • positive_scores (torch.tensor) – 来自同一类别条目的分数。

  • negative_scores (torch.tensor) – 来自不同类别条目的分数。

  • c_miss (float) – 分配给缺失错误的成本(默认值为1.0)。

  • c_fa (float) – 分配给误报的成本(默认值为1.0)。

  • p_target (float) – 拥有目标的先验概率(默认值为0.01)。

Returns:

  • minDCF (float) – minDCF 分数。

  • threshold (float) – minDCF 分数对应的阈值。

Example

>>> positive_scores = torch.tensor([0.6, 0.7, 0.8, 0.5])
>>> negative_scores = torch.tensor([0.4, 0.3, 0.2, 0.1])
>>> val_minDCF, threshold = minDCF(positive_scores, negative_scores)
>>> val_minDCF
0.0
class speechbrain.utils.metric_stats.ClassificationStats[source]

基础:MetricStats

计算与多标签分类任务相关的统计信息,以及可以为了评估目的而松散解释为此类任务的任务。

Example

>>> import sys
>>> from speechbrain.utils.metric_stats import ClassificationStats
>>> cs = ClassificationStats()
>>> cs.append(
...     ids=["ITEM1", "ITEM2", "ITEM3", "ITEM4"],
...     predictions=[
...         "M EY K AH",
...         "T EY K",
...         "B AE D",
...         "M EY K",
...     ],
...     targets=[
...         "M EY K",
...         "T EY K",
...         "B AE D",
...         "M EY K",
...     ],
...     categories=[
...         "make",
...         "take",
...         "bad",
...         "make"
...     ]
... )
>>> cs.write_stats(sys.stdout)
Overall Accuracy: 75%

Class-Wise Accuracy
-------------------
bad -> B AE D : 1 / 1 (100.00%)
make -> M EY K: 1 / 2 (50.00%)
take -> T EY K: 1 / 1 (100.00%)

Confusion
---------
Target: bad -> B AE D
  -> B AE D   : 1 / 1 (100.00%)
Target: make -> M EY K
  -> M EY K   : 1 / 2 (50.00%)
  -> M EY K AH: 1 / 2 (50.00%)
Target: take -> T EY K
  -> T EY K   : 1 / 1 (100.00%)
>>> summary = cs.summarize()
>>> summary['accuracy']
0.75
>>> summary['classwise_stats'][('bad', 'B AE D')]
{'total': 1.0, 'correct': 1.0, 'accuracy': 1.0}
>>> summary['classwise_stats'][('make', 'M EY K')]
{'total': 2.0, 'correct': 1.0, 'accuracy': 0.5}
>>> summary['keys']
[('bad', 'B AE D'), ('make', 'M EY K'), ('take', 'T EY K')]
>>> summary['predictions']
['B AE D', 'M EY K', 'M EY K AH', 'T EY K']
>>> summary['classwise_total']
{('bad', 'B AE D'): 1.0, ('make', 'M EY K'): 2.0, ('take', 'T EY K'): 1.0}
>>> summary['classwise_correct']
{('bad', 'B AE D'): 1.0, ('make', 'M EY K'): 1.0, ('take', 'T EY K'): 1.0}
>>> summary['classwise_accuracy']
{('bad', 'B AE D'): 1.0, ('make', 'M EY K'): 0.5, ('take', 'T EY K'): 1.0}
append(ids, predictions, targets, categories=None)[source]

将输入、预测和目标附加到内部列表中

Parameters:
  • ids (list) – 样本的字符串ID

  • predictions (list) – 模型的预测结果(人类可解释的,最好是字符串)

  • targets (list) – 真实值(人类可解释的,最好是字符串)

  • categories (list) – 一种额外的分类训练样本的方式。如果可用,这些类别将与目标结合

summarize(field=None)[source]

总结分类指标分数

计算以下统计量:

准确率:总体准确率(正确数 / 总数) 混淆矩阵:一个类型的字典

{(target, prediction): num_entries} 表示混淆矩阵

classwise_stats: computes the total number of samples,

每个类别的正确分类数量和准确率

keys: all available class keys, which can be either target classes

或(类别,目标)元组

predictions: all available predictions all predictions the model

已经完成

Parameters:

field (str) – 如果提供,仅返回选定的统计信息。如果不提供,则返回所有计算的统计信息。

Returns:

如果提供了field,则返回一个浮点数,否则返回包含所有计算统计信息的字典。

Return type:

floatdict

clear()[source]

清除收集的统计信息

write_stats(filestream)[source]

以人类可读的格式将统计信息输出到指定的文件流

Parameters:

filestream (file) – 一个类似文件的对象

class speechbrain.utils.metric_stats.MultiMetricStats(metric, n_jobs=1, batch_eval=False)[source]

基础类:object

一个同时评估多个指标的包装器

Parameters:
  • metric (function) – 用于计算相关指标的函数。该函数应至少接受两个参数(predictions 和 targets),并可以选择性地接受一个或两个参数的相对长度。该函数应返回一个字典或命名元组。

  • n_jobs (int) – 用于计算指标的作业数量。如果大于一,每个样本将单独处理,否则整个批次将一次性传递。

  • batch_eval (bool) – 当为True时,它使用批量输入来评估指标。 当为False且n_jobs=1时,它按顺序逐个执行指标评估。 当为False且n_jobs>1时,评估使用joblib在不同的输入上并行运行。

Example

>>> def metric(a, b):
...    return {
...        "sum": a + b,
...        "diff": a - b,
...        "sum_sq": a**2 + b**2
...    }
>>> multi_metric = MultiMetricStats(metric, batch_eval=True)
>>> multi_metric.append([1, 2], a=torch.tensor([2.0, 1.0]), b=torch.tensor([1.0, 2.0]))
>>> multi_metric.append([3, 4], a=torch.tensor([4.0, 5.0]), b=torch.tensor([0.0, 1.0]))
>>> multi_metric.append([5, 6], a=torch.tensor([2.0, 4.0]), b=torch.tensor([4.0, 2.0]))
>>> multi_metric.append([7, 8], a=torch.tensor([2.0, 4.0]), b=torch.tensor([4.0, 2.0]))
>>> multi_metric.summarize() 
{'sum': {'average': 5.0,
  'min_score': 3.0,
  'min_id': 1,
  'max_score': 6.0,
  'max_id': 4},
 'diff': {'average': 1.0,
  'min_score': -2.0,
  'min_id': 5,
  'max_score': 4.0,
  'max_id': 3},
 'sum_sq': {'average': 16.5,
  'min_score': 5.0,
  'min_id': 1,
  'max_score': 26.0,
  'max_id': 4}}
>>> multi_metric.summarize(flat=True) 
{'sum_average': 5.0,
 'sum_min_score': 3.0,
 'sum_min_id': 1,
 'sum_max_score': 6.0,
 'sum_max_id': 4,
 'diff_average': 1.0,
 'diff_min_score': -2.0,
 'diff_min_id': 5,
 'diff_max_score': 4.0,
 'diff_max_id': 3,
 'sum_sq_average': 16.5,
 'sum_sq_min_score': 5.0,
 'sum_sq_min_id': 1,
 'sum_sq_max_score': 26.0,
 'sum_sq_max_id': 4}
append(ids, *args, **kwargs)[source]

存储一组特定的指标分数。

Parameters:
  • ids (list) – 对应于话语的ID列表。

  • *args (tuple) – 传递给度量函数的参数。

  • **kwargs (dict) – 传递给度量函数的参数。

eval_simple(*args, **kwargs)[source]

以简单、顺序的方式评估指标

summarize(field=None, flat=False)[source]

总结指标分数,返回相关统计数据。

Parameters:
  • field (str) – 如果提供,仅返回选定的统计信息。如果不提供,则返回所有计算的统计信息。

  • flat (bool) – 是否将字典展平

Returns:

返回所有计算统计数据的字典

Return type:

dict