目录
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