speechbrain.utils.metric_stats 模块
metric_stats
模块提供了一个抽象类,用于存储实验过程中生成的统计数据并进行汇总。
- 作者
Peter Plantinga 2020
Mirco Ravanelli 2020
Gaëlle Laperrière 2021
Sahar Ghannay 2021
摘要
类
跟踪二元指标,如精度、召回率、F1、EER 等。 |
|
计算与多标签分类任务相关的统计数据,以及出于评估目的可以大致解释为多标签分类任务的统计数据。 |
|
实现了 EmbER 指标中的相似性函数,该函数定义于 https://www.isca-archive.org/interspeech_2022/roux22_interspeech.pdf |
|
一个用于跟踪错误率(例如,WER、PER)的类。 |
|
一个用于存储和汇总任意指标的默认类。 |
|
一个同时评估多个指标的封装器 |
|
一个指标,它使用任何选定的方法重新衡量 |
函数
计算 EER(及其阈值)。 |
|
计算通常用于评估说话人确认系统的 minDCF 指标。 |
|
如果在多个任务上并行,则运行指标评估。 |
|
按顺序在输入上运行指标评估。 |
参考
- class speechbrain.utils.metric_stats.MetricStats(metric, n_jobs=1, batch_eval=True)[source]
基类:
object
一个用于存储和汇总任意指标的默认类。
通过继承此类可以创建更复杂的指标。
- 参数:
示例
>>> 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'
- 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)的类。
- 参数:
merge_tokens (bool) – 是否合并连续的 token(例如,用于从字符 token 创建单词)。请参阅
speechbrain.dataio.dataio.merge_char
。split_tokens (bool) – 是否分割 token(例如,用于从词 token 创建字符)。请参阅
speechbrain.dataio.dataio.split_word
。space_token (str) – 用于边界的字符。与
merge_tokens
一起使用时,这表示合并后用于分割的字符。与split_tokens
一起使用时,序列会用此 token 连接起来,然后整个序列被分割。keep_values (bool) – 是否保留概念的值。
extract_concepts_values (bool) – 处理预测和目标,仅保留概念和值。
tag_in (str) – 概念的开始(例如 ‘<’)。
tag_out (str) – 概念的结束(例如 ‘>’)。
equality_comparator (Callable[[str, str], bool]) – 用于检查两个词是否相等的函数。
示例
>>> 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()
- 参数:
ids (list) – 与话语相对应的 ID 列表。
predict (torch.tensor) – 预测输出,用于与目标输出进行比较
target (torch.tensor) – 正确的参考输出,用于与预测进行比较。
predict_len (torch.tensor) – 预测的相对长度,用于取消预测中的填充(如果存在)。
target_len (torch.tensor) – 目标输出的相对长度,用于取消目标中的填充(如果存在)。
ind2lab (callable) – 可调用对象,用于将索引映射到标签,在批次上操作,用于写入对齐。
- class speechbrain.utils.metric_stats.WeightedErrorRateStats(base_stats: ErrorRateStats, cost_function: Callable[[str, str | None, str | None], float], weight_name: str = 'weighted')[source]
基类:
MetricStats
一个指标,它使用任何选定的方法重新衡量
ErrorRateStats
的 WER。这不会修改找到的编辑序列(插入/删除/替换),但会将其对指标的影响乘以成本函数返回的 0 到 1 之间的值。- 参数:
- append(*args, **kwargs)[source]
Append 函数,不应用于加权错误率统计。请转而附加到指定的
base_stats
。WeightedErrorRateStats
重用基础ErrorRateStats
类中的分数。
- summarize(field=None)[source]
返回一个字典,其中包含一些详细的加权 WER 统计信息,这些信息是通过使用
cost_function
确定的权重(无错误返回0.0
,默认错误行为返回1.0
,介于两者之间则返回其他值)对每次编辑进行加权后计算得出的。不要求已经调用过
summarize()
。完整的字段集合,**每个字段都带有
<weight_name_specified_at_init>_
前缀:** -wer
: 加权 WER(比率*100
) -insertions
: 加权插入数 -substitutions
: 加权替换数 -deletions
: 加权删除数 -num_edits
: 加权插入数/替换数/删除数之和此外,此函数会为每对句子填充一个
scores
列表。该列表的每个条目都是一个字典,包含以下字段: -key
: 话语的 ID。WER
,insertions
,substitutions
,deletions
,num_edits
具有与上述相同的语义,但作用于句子级别而非全局级别。- 参数:
field (str, optional) – 要返回的字段,如果您只对其中一个感兴趣。如果指定,将返回一个单独的
float
,否则返回一个字典。- 返回:
dict from str to float, if
field is None
– 一个包含上述文档字段的字典。float, if
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
实现了 EmbER 指标中的相似性函数,该函数定义于 https://www.isca-archive.org/interspeech_2022/roux22_interspeech.pdf
此指标涉及一个将标记映射到单个词嵌入的字典。当嵌入相似度足够高时,WER 中的替换错误会被降低权重。目标是减少语义影响较小的替换错误的影响。只有替换错误会被加权。
这是通过计算两个嵌入之间的余弦相似度来完成的,然后如果
similarity >= threshold
,则使用low_similarity_weight
对替换进行加权,否则使用high_similarity_weight
进行加权(例如,高相似度的替换可以降低权重,使其重要性仅为低相似度替换的 10%)。Note
引用的论文建议使用
(1.0, 0.1, 0.4)
作为 fastText 法语嵌入的默认值,这是通过经验选择的。使用不同的嵌入时,您可能需要测试其他值;因此我们不提供默认值。- 参数:
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) – 余弦相似度阈值,用于确定该词的替换错误应加权多少。
- class speechbrain.utils.metric_stats.BinaryMetricStats(positive_label=1)[source]
基类:
MetricStats
跟踪二元指标,如精度、召回率、F1、EER 等。
- summarize(field=None, threshold=None, max_samples=None, beta=1, eps=1e-08)[source]
使用全部分数集合计算统计数据。
- 完整的字段集合
TP - 真阳性
TN - 真阴性
FP - 假阳性
FN - 假阴性
FAR - 错误接受率
FRR - 错误拒绝率
DER - 检测错误率(如果未传递阈值,则为 EER)
threshold - 阈值(如果未传递阈值,则为 EER 阈值)
precision - 精确率(阳性预测值)
recall - 召回率(敏感性)
F-score - 精确率和召回率的平衡(如果 beta=1 则相等)
MCC - 麦考利相关系数
- 参数:
- 返回:
如果指定了 field,则只返回该字段的分数。如果 field 为 None,则返回完整的字段集合。
- 返回类型:
summary
- speechbrain.utils.metric_stats.EER(positive_scores, negative_scores)[source]
计算 EER(及其阈值)。
- 参数:
positive_scores (torch.tensor) – 来自同类条目的分数。
negative_scores (torch.tensor) – 来自不同类条目的分数。
- 返回:
EER (float) – EER 分数。
threshold (float) – EER 分数对应的阈值。
示例
>>> 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 是误报概率。
- 参数:
- 返回:
minDCF (float) – minDCF 分数。
threshold (float) – minDCF 分数对应的阈值。
示例
>>> 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
计算与多标签分类任务相关的统计数据,以及出于评估目的可以大致解释为多标签分类任务的统计数据。
示例
>>> 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}
- class speechbrain.utils.metric_stats.MultiMetricStats(metric, n_jobs=1, batch_eval=False)[source]
基类:
object
一个同时评估多个指标的封装器
- 参数:
示例
>>> 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}