paddlepaddle(五)自定义评价指标

目录

1.LOSS

1.1预置loss函数

1.2自定义loss函数 

2.metric

2.1预设的metric类

2.2自定义metric类 


paddle除了预置的计算指标函数外,还支持自定义计算指标

1.LOSS

1.1预置loss函数

paddle.nn下预置了常见的loss函数

  • paddle.nn.BCELoss                  BCELoss层
  • paddle.nn.BCEWithLogitsLoss BCEWithLogitsLoss层
  • paddle.nn.CrossEntropyLoss                交叉熵损失层
  • paddle.nn.CTCLoss                        CTCLoss层
  • paddle.nn.HSigmoidLoss                    层次sigmoid损失层
  • paddle.nn.KLDivLoss                          Kullback-Leibler散度损失层
  • paddle.nn.L1Loss                                L1损失层
  • paddle.nn.MarginRankingLoss             MarginRankingLoss层
  • paddle.nn.MSELoss                                均方差误差损失层
  • paddle.nn.NLLLoss                                NLLLoss层
  • paddle.nn.SmoothL1Loss                        平滑L1损失层

1.2自定义loss函数 

类似于网络层,重写__init__和forward()函数。

import paddle
from paddle import nn
from paddle.nn import functional as F
import numpy as np
class myloss(nn.Layer):
    def __init__(self):
        super(myloss, self).__init__()

    def forward(self, outputs, labels):
        return F.softmax_with_cross_entropy(outputs, labels).mean()

outputs = paddle.rand([4, 10], dtype='float32')
labels = paddle.to_tensor([[0], [2], [4], [6]])

loss = myloss()
print(loss(outputs, labels))

####
Tensor(shape=[1], dtype=float32, place=CPUPlace, stop_gradient=True,
       [2.49037051])

2.metric

2.1预设的metric类

在paddle.metric下有许多预置的评估函数类

  • Metric        评估器基类
  • Accuracy        准确率评估器类
  • Auc                auc评估器类
  • Precision        精确率评估器类
  • Recall                召回率评估器类

使用方式一:单独使用

compute函数将输入数据做一定的处理(可加速update函数计算),update函数接受compute的结果数据,计算出一个batch的评估数据。accumulate利用update中积累的成员变量数据进行计算后返回。

x = paddle.to_tensor(np.array([
    [0.1, 0.2, 0.3, 0.4],
    [0.1, 0.4, 0.3, 0.2],
    [0.1, 0.2, 0.4, 0.3],
    [0.1, 0.2, 0.3, 0.4]]))
y = paddle.to_tensor(np.array([[0], [1], [2], [3]]))

metric = paddle.metric.Accuracy()
# 处理输入的数据(predictions,labels)
inputs = metric.compute(x, y)
# 对一个batch做计算
acc = metric.update(inputs)
# 累积所有的batch的计算结果
fin_acc = metric.accumulate()

print(fin_acc)

####
0.75

 方式二:paddle.model封装的模型中使用

model.prepare(
    optim,
    loss=paddle.nn.CrossEntropyLoss(),
    metrics=paddle.metric.Accuracy())

2.2自定义metric类 

重写下面几个方法就可以实现自定义的metric类

from paddle.metric import Metric

class Precision(Metric):
    def __init__(self, name='precision', *args, **kwargs):
        super(Precision, self).__init__(*args, **kwargs)
        self.tp = 0  # true positive
        self.fp = 0  # false positive
        self._name = name
    
    def update(self, preds, labels):
        if isinstance(preds, paddle.Tensor):
            preds = preds.numpy()
        elif not _is_numpy_(preds):
            raise ValueError("The 'preds' must be a numpy ndarray or Tensor.")
        if isinstance(labels, paddle.Tensor):
            labels = labels.numpy()
        elif not _is_numpy_(labels):
            raise ValueError("The 'labels' must be a numpy ndarray or Tensor.")

        sample_num = labels.shape[0]
        preds = np.floor(preds + 0.5).astype("int32")

        for i in range(sample_num):
            pred = preds[i]
            label = labels[i]
            if pred == 1:
                if pred == label:
                    self.tp += 1
                else:
                    self.fp += 1

    def reset(self):
        """
        实现reset方法,每个Epoch结束后进行评估指标的重置,这样下个Epoch可以重新进行计算。
        """
        self.tp = 0
        self.fp = 0

    def accumulate(self):
        ap = self.tp + self.fp
        return float(self.tp) / ap if ap != 0 else .0

    def name(self):
        """
        实现name方法,返回定义的评估指标名字
        """
        return self._name  

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值