文档反馈

问题文档片段

问题文档片段包含公式时,显示为空格。

提交类型
issue

有点复杂...

找人问问吧。

PR

小问题,全程线上修改...

一键搞定!

请选择提交类型

问题类型
规范和低错类

- 规范和低错类:

- 错别字或拼写错误,标点符号使用错误、公式错误或显示异常。

- 链接错误、空单元格、格式错误。

- 英文中包含中文字符。

- 界面和描述不一致,但不影响操作。

- 表述不通顺,但不影响理解。

- 版本号不匹配:如软件包名称、界面版本号。

易用性

- 易用性:

- 关键步骤错误或缺失,无法指导用户完成任务。

- 缺少主要功能描述、关键词解释、必要前提条件、注意事项等。

- 描述内容存在歧义指代不明、上下文矛盾。

- 逻辑不清晰,该分类、分项、分步骤的没有给出。

正确性

- 正确性:

- 技术原理、功能、支持平台、参数类型、异常报错等描述和软件实现不一致。

- 原理图、架构图等存在错误。

- 命令、命令参数等错误。

- 代码片段错误。

- 命令无法完成对应功能。

- 界面错误,无法指导操作。

- 代码样例运行报错、运行结果不符。

风险提示

- 风险提示:

- 对重要数据或系统存在风险的操作,缺少安全提示。

内容合规

- 内容合规:

- 违反法律法规,涉及政治、领土主权等敏感词。

- 内容侵权。

请选择问题类型

问题描述

点击输入详细问题描述,以帮助我们快速定位问题。

自定义评价指标

查看源文件

评价指标(Metrics)可以用来评估模型结果的可信度。

MindSpore提供了多种Metrics评估指标,如:accuracylossprecisionrecallF1等,完整的Metrics功能可参考API

用户也可根据需求,自行开发并使用Metrics。

Metrics自定义方法

通过Class实现一个自定义的 Metric 功能,其中包含以下四部分:

  • init:初始化,同时进行输入的校验。

  • clear:变量初始化。

  • update:进行中间过程的计算。

  • eval:计算得到最后的输出值。

下面以相似度计算函数Dice为例,讲解 Metrics 的开发过程。

导入Metric模块

import numpy as np
from mindspore.nn.metrics.metric import Metric, rearrange_inputs

定义Metrics

Dice实际上计算了两个样本间的相似度,数学公式可以表达为:

dice=2×(predtrue)predtrue

Dice的输入为两个尺度相同的Tensor, list或numpy,一个为预测值,一个为实际值。最后输出两个Tensor间的相似度计算值。其中为防止计算过程中分母为零,引入参数smooth,默认值为1e-5。

代码实现为:

class Dice(Metric):

    def __init__(self, smooth=1e-5):
        """调用super进行初始化"""
        super(Dice, self).__init__()
        self.smooth = smooth
        # 调用clear清空变量
        self.clear()

    def clear(self):
        """清除内部计算结果,变量初始化"""
        self._dice_coeff_sum = 0
        self._samples_num = 0

    @rearrange_inputs
    def update(self, *inputs):
        """更新内部计算结果"""

        # 校验输入的数量,y_pred为预测值,y为实际值
        if len(inputs) != 2:
            raise ValueError('Dice need 2 inputs (y_pred, y), but got {}'.format(len(inputs)))
        # 将输入的数据格式变为numpy array
        y_pred = self._convert_data(inputs[0])
        y = self._convert_data(inputs[1])
        # 参数计算
        self._samples_num += y.shape[0]

        # 校验输入的shape是否一致
        if y_pred.shape != y.shape:
            raise RuntimeError('y_pred and y should have same the dimension, but the shape of y_pred is{}, '
                               'the shape of y is {}.'.format(y_pred.shape, y.shape))

        # 根据公式实现Dice的过程计算
        intersection = np.dot(y_pred.flatten(), y.flatten())
        unionset = np.dot(y_pred.flatten(), y_pred.flatten()) + np.dot(y.flatten(), y.flatten())

        single_dice_coeff = 2 * float(intersection) / float(unionset + self.smooth)
        self._dice_coeff_sum += single_dice_coeff


    def eval(self):
        """进行Dice计算"""
        if self._samples_num == 0:
            raise RuntimeError('Total samples num must not be 0.')

        return self._dice_coeff_sum / float(self._samples_num)

在框架中导入Metrics

在同级目录中的__init__.py文件中,添加已经定义好的Dice。可以点击链接查看文件的具体位置,Metrics在框架中位于mindspore/nn/metrics/目录下:

__all__ = [
…
    "Dice",
…
]

__factory__ = {
…
    'dice': Dice,
…
}